2016-08-11 7 views
0

У меня есть эта программаОшибка чтения CSV файл unicodeescape

import csv 

with open("C:\Users\frederic\Desktop\WinPython-64bit-3.4.4.3Qt5\notebooks\scores.txt","r") as scoreFile: 
    # write = w, read = r, append = a 
    scoreFileReader = csv.reader(scoreFile) 
    scoreList = [] 
    for row in scoreFileReader: 
     if len (row) != 0: 
      scoreList = scoreList + [row] 

scoreFile.close() 

print(scoreList) 

Почему я получаю эту ошибку?

with open("C:\Users\frederic\Desktop\WinPython-64bit-3.4.4.3Qt5\notebooks\scores.txt","r") as scoreFile: ^SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape.

+0

Возможный дубликат [Python открыт ошибка Юникода файл] (http://stackoverflow.com/questions/18276283/python-open-file-unicode-error) –

ответ

0

вы можете попробовать это:

import csv 
import io 

def guess_encoding(csv_file): 
    """guess the encoding of the given file""" 
    with io.open(csv_file, "rb") as f: 
     data = f.read(5) 
    if data.startswith(b"\xEF\xBB\xBF"): # UTF-8 with a "BOM" 
     return ["utf-8-sig"] 
    elif data.startswith(b"\xFF\xFE") or data.startswith(b"\xFE\xFF"): 
     return ["utf-16"] 
    else: # in Windows, guessing utf-8 doesn't work, so we have to try 
     try: 
      with io.open(csv_file, encoding="utf-8") as f: 
       preview = f.read(222222) 
       return ["utf-8"] 
     except: 
      return [locale.getdefaultlocale()[1], "utf-8"] 

encodings = guess_encoding(r"C:\Users\frederic\Desktop\WinPython-64bit-3.4.4.3Qt5\notebooks\scores.txt")[0]) 

# then your code with 
with open(r"C:\Users\frederic\Desktop\WinPython-64bit-3.4.4.3Qt5\notebooks\scores.txt","r", encoding=encodings[0]) as scoreFile: 
0

Вы должны использовать сырые строки с именами файлов для Windows-стиле:

with open(r"C:\Users\frederic\Desktop\WinPython-64bit-3.4.4.3Qt5\notebooks\scores.txt", 'r') as scoreFile: 
     ^^ 

В противном случае строка двигатель Python думает, что \ U является начало escape-последовательности Unicode, что, конечно же, не в этом случае.


Кроме того, будьте осторожны, и ваша scoreFile.close() бесполезно:

with заявление заменить попытаться поймать. Он также автоматически закроет файл после блока. Это означает, что вы можете удалить строку scoreFile.close().

Кроме того, вы можете изменить линию if len(row) != 0 По PEP8:

For sequences, (strings, lists, tuples), use the fact that empty sequences are false.

Yes: if not seq: if seq:

No: if len(seq): if not len(seq):

Одна последняя вещь, ваш for loop это не очень хорошо, чтобы читать csv вам лучше начать копировать пример из doc первым!

with open('eggs.csv', 'rb') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') 
    for row in spamreader: 
     print ', '.join(row) 
Смежные вопросы