2016-06-19 8 views
3

Мне нужно импортировать CSV-файл в Python в Windows. Мой файл разделен символом ';' и имеет строки с неанглийскими символами и запятыми (',').Python import CSV short code (pandas?), Ограниченный ';' и ',' in entires

Я читал сообщения:

Importing a CSV file into a sqlite3 database table using Python

Python import csv to list

Когда я бегу:

with open('d:/trade/test.csv', 'r') as f1: 
    reader1 = csv.reader(f1) 
    your_list1 = list(reader1) 

Я получаю вопрос: запятая меняется на '-' символ.

Когда я пытаюсь:

df = pandas.read_csv(csvfile) 

Я получил ошибки:

pandas.io.common.CParserError: Error tokenizing data. C error: Expected 1 fields in line 13, saw 2.

Пожалуйста, помогите. Я бы предпочел использовать pandas, поскольку код короче, без указания всех имен полей из файла CSV.

Я понимаю, что возможно временная замена запятых. Тем не менее, я хотел бы решить это по некоторым параметрам пандам.

+0

Можем ли мы увидеть небольшой фрагмент ваших данных CSV, который производит эту проблему? – totoro

+0

'reader1 = csv.reader (f1, delimiter = ';')' - попробуйте это. –

ответ

1

Если ваш файл CSV не работает, вы можете попытаться сделать csv угадать свой формат.

import csv 

with open('d:/trade/test.csv', 'r') as f1: 
    dialect = csv.Sniffer().sniff(f1.read(1024)) 
    f1.seek(0) 
    r = csv.reader(f1, dialect=dialect) 
    for row in r: 
     print(row) 
1

Панды документация говорит по параметрам:

pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

sep : str, default ‘,’ 

    Delimiter to use. If sep is None, will try to automatically determine this. 

Еще не получить, что мой файл ограничен ';' почему-то имена столбцов были довольно простыми. Добавление параметра sep в panda исправило проблему.

4

Pandas решение - использовать read_csv с сепаратором regex [;,]. Вам нужно добавить engine='python', так как предупреждение:

ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support regex separators (separators > 1 char and different from '\s+' are interpreted as regex); you can avoid this warning by specifying engine='python'.

import pandas as pd 
import io 

temp=u"""a;b;c 
1;1,8 
1;2,1 
1;3,6 
1;4,3 
1;5,7 
""" 
#after testing replace io.StringIO(temp) to filename 
df = pd.read_csv(io.StringIO(temp), sep="[;,]", engine='python') 
print (df) 

    a b c 
0 1 1 8 
1 1 2 1 
2 1 3 6 
3 1 4 3 
4 1 5 7