Сокращенный код CSV для импорта Python (панды?), Разделенный знаком ';' и ',' в строках

Мне нужно импортировать файл CSV в Python в Windows. Мой файл разделен знаком ';' и содержит строки с неанглийскими символами и запятыми (',').

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

Импорт файла CSV в таблицу базы данных sqlite3 с использованием Python

Python импортирует CSV в список

Когда я бегу:

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: Ошибка токенизации данных. Ошибка C: ожидалось 1 поле в строке 13, видел 2.

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

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


person Alexei Martianov    schedule 19.06.2016    source источник
comment
Можем ли мы увидеть небольшой фрагмент ваших данных CSV, который вызывает проблему?   -  person totoro    schedule 19.06.2016
comment
reader1 = csv.reader(f1, delimiter=';') - попробуйте.   -  person Burhan Khalid    schedule 19.06.2016


Ответы (5)


Решение Pandas - используйте _1 _ с разделителем регулярных выражений [;,]. Вам нужно добавить engine='python', потому что предупреждение:

ParserWarning: возврат к движку 'python', поскольку механизм 'c' не поддерживает разделители регулярных выражений (разделители> 1 символа и отличные от '\ s +' интерпретируются как регулярные выражения); этого предупреждения можно избежать, указав 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
person jezrael    schedule 19.06.2016

В документации Pandas указаны параметры:

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.

Pandas не проанализировал мой файл, разделенный ;, потому что по умолчанию это не None, обозначенное для автоматического, а ,. Добавление параметра sep в ; для pandas устранило проблему.

person Alexei Martianov    schedule 19.06.2016

Если ваш файл 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)
person totoro    schedule 19.06.2016

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

В этом примере я использовал ASCII, но он мог быть другим.

df = pd.read_csv(fname, encoding='ascii')
person Santosh Pathak    schedule 24.11.2018

Чтобы избежать предупреждения ниже в вашем коде,

ParserWarning: возврат к движку 'python', поскольку механизм 'c' не поддерживает разделители регулярных выражений (разделители> 1 символа и отличные от '\ s +' интерпретируются как регулярные выражения); вы можете избежать этого предупреждения, указав engine = 'python'

Используйте имена свойств внутри вашей read_csv функции. Посмотрите пример для обоих случаев, когда появляется это предупреждение, а где нет.

КОД, КОТОРЫЙ ВЫБРАСЫВАЕТ ПРЕДУПРЕЖДЕНИЕ:

selEncoding = "ISO-8859–1"

dfCovid19DS = pd.read_csv(dsSrcPath, selEncoding)

КОД БЕЗ ПРЕДУПРЕЖДЕНИЙ:

selEncoding = "ISO-8859–1"

dfCovid19DS = pd.read_csv(dsSrcPath, encoding = selEncoding)
person Ashish    schedule 15.06.2020
comment
Кредит, при наличии: это по сути тот же ответ, что @ Santosh-Pathak дал два года назад (ссылка). - person Jeremy Caney; 16.06.2020