Использование правильной кодировки для CSV-файла в Python 3 - PullRequest
0 голосов
/ 18 сентября 2018

Я написал функцию, которая принимает одну переменную, file, которая является большим .csv документом.Я получаю следующую ошибку сразу после вызова функции для одного конкретного файла (файл на немецком языке):

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe4 in position 4: invalid continuation byte

Кодировка системы по умолчанию utf-8, но если я open('C:/Users/me/Desktop/data/myfile.csv'), вывод:

<_io.TextIOWrapper name='C:/Users/me/Desktop/data/myfile.csv' mode='r' encoding='cp1252'>.

Использование file.decode('cp1252').encode('utf8') не работает с 'str' object has no attribute 'decode', поэтому я попытался:

for decodedLine in open('C:/Users/me/Desktop/data/myfile.csv', 'r', encoding='cp1252'):
    line = decodedLine.split('\t')

, ноline является объектом списка, и я не могу .encode() его.

Как я могу сделать .csv файлы с другой кодировкой для чтения?

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Если я правильно понимаю, у вас есть файл csv с кодировкой cp1252. Если это так, все, что вам нужно сделать, это открыть файл с правильной кодировкой. Что касается csv, я бы использовал модуль csv из стандартной библиотеки. В качестве альтернативы вы можете обратиться к более специализированной библиотеке, например pandas.

В любом случае, для разбора вашего csv вы можете сделать просто:

import csv

with open(filepath, 'r', encoding='cp1252') as file_obj:
    # adjust the parameters according to your file, see docs for more
    csv_obj = csv.reader(file_obj, delimiter='\t', quotechar='"')
    for row in csv_obj:
        # row is a list of entries
        # this would print all entries, separated by commas
        print(', '.join(row))
0 голосов
/ 18 сентября 2018

Я бы предложил попробовать открыть его с помощью панд, используя функцию read.csv с различными кодировками, пока он не отобразится правильно. Попробуйте кодировку:

import pandas as pd
df = pd.read_csv(r'C:yourpath',encoding = "latin-1")

Если это не сработает, попробуйте похожие кодировки, пока не найдете его.

Тогда вы можете использовать правильную кодировку, как хотите.

...