【问题标题】:Error reading csv file unicodeescape读取 csv 文件 unicodeescape 时出错
【发布时间】:2016-12-18 03:31:21
【问题描述】:

我有这个程序

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)

为什么会出现此错误?

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

【问题讨论】:

标签: python csv unicode-escapes


【解决方案1】:

您需要使用带有 Windows 样式文件名的原始字符串:

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

否则,Python 的字符串引擎会认为 \U 是 Unicode 转义序列的开始 - 当然在这种情况下不是。


另外,还要小心你的scoreFile.close() 没用:

with 语句替换了 try 和 catch。它也是 块后自动关闭文件。这意味着您可以删除 scoreFile.close() 行。

另外,你可以换行if len(row) != 0 根据PEP8

对于序列,(字符串,列表,元组),使用空的事实 序列是错误的。

是:如果不是 seq: 如果序列:

否:如果 len(seq): 如果不是 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)

【讨论】:

    【解决方案2】:

    你可以试试这个:

    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:
    

    【讨论】:

      猜你喜欢
      • 2018-09-01
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 2020-01-29
      • 2013-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多