打开包含未定义字符的文件(csv. gz)并将文件传递到函数中

dw1jzc5e  于 2023-09-28  发布在  其他
关注(0)|答案(2)|浏览(92)

我有一个函数,其中传递的参数是5个文件路径。但是,第一个路径是到csv. gz,其中文件内部似乎有一个未定义的字符。我该如何解决这个问题?
我使用Python版本3.11.1。代码和错误信息如下所示。

function(r"filepath1", r"filepath2", r"filepath3", r"filepath4", r"filepath5")

错误消息:

Cell In[3], line 8, in function(filepath1, filepath2, filepath3, filepath4, filepath5)
 6 file1DateMap = {}
 7 infd = open(file1path1, 'r')
 8 infd.readline()
 9 for line in infd:
10     tokens = line.strip().split(',')
 
File ~\AppData\Local\Programs\Python\Python311\Lib\encodings\cp1252.py:23, in IncrementalDecoder.decode(self, input, final)
22 def decode(self, input, final=False):
23     return codecs.charmap_decode(input,self.errors,decoding_table)[0]
 
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 94: character maps to undefined

我试

file = open(filename, encoding="utf8")

但编码在我的Python版本中是未定义的。
我尝试了“带开”的方法

file2 = r"file2path"
file3 = r"file3path"
file4 = r"file4path"
file5 = r"file5path"
file1name = r"file1path"
with open(file1name, 'r') as file1:
    function(file1, file2, file3, file4, file5)

但是函数需要一个字符串:
TypeError:需要str、bytes或os.PathLike对象,而不是TextIOWrapper
我期待该函数运行并将处理后的输出写入桌面上的文件夹。

  • 更新 *

我在Visual Studio Code中检查了文件的编码,它表示UTF 8。我写了下面的代码:

with open(r"path1", encoding="utf8") as openfile1:
    file1 = openfile1.read()

收到此错误:
Unicode解码错误:“utf-8”编解码器无法解码位置1的字节0x 8b:无效起始字节

  • 更新2*

已检查此代码的编码

with open(r"filepath1") as f:
    print(f)

encoding='cp1252'
但是现在当我传递新的编码参数时:

with open(r"path1", encoding="cp1252") as openfile1:
    file1 = openfile1.read()

我回到了广场1,并给出了以下错误消息:
Unicode解码错误:“charmap”编解码器无法解码位置94的字节0x 9d:字符Map到未定义

  • 更新3*

Gzip成功了。我使用了以下代码:

import gzip
with gzip.open(r"path1", mode="rb") as openfile1:
    file1 = openfile1.read()
7dl7o3gd

7dl7o3gd1#

在这个源代码中有几处混乱之处。

with open(file1name, 'r') as file1:
    function(file1, file2, file3, file4, file5)

请理解file1是一个打开的文件句柄,其type(...)为TextIOWrapper。它是可迭代的,你可以从它请求文本行。相反,file2等人是str路径名;你不能从这些对象请求文件系统文本行。
您为它们选择的并行命名结构很可能会让您自己以及在未来几个月内遇到此代码的任何不幸的维护工程师感到困惑。建议您采用像path2这样的名称。path5
默认编码为CodePage1252。您通过省略可选的encoding=参数来请求使用open(file1name, 'r')进行编码。请注意,mode='r'是默认值,因此您也可以忽略它。
相比之下,open(filename, encoding="utf8")使用完全不同的编码打开读取访问。
编码是基础.CSV文件的属性,而不是程序的属性。也就是说,您必须知道正确的底层编码是什么,并且您必须告诉open正确的编码。你可以在默认情况下这样做,也可以显式地这样做,只要你做对了。我建议明确地这样做。
如果你不知道编码,可以使用/usr/bin/file/usr/local/bin/iconv或文本编辑器来了解它是什么,如果你对它当前的编码不满意,可以将它改为UTF-8。
大多数现代机器上的大多数文件都应该是UTF-8编码的--否则会带来麻烦。但我跑题了。
一旦你确定了一些已知的编码,通过encoding=参数将它传递给open,你就可以开始工作了!

6tr1vspr

6tr1vspr2#

如果你有一个CSV文件压缩成一个gzip文件,你应该能够像下面这样简单地读取gzip文件:

with gzip.open("input.csv.gz", "rt", newline="", encoding="utf-8") as f:

我相信您会希望rt将其作为文本读取(而不是rb,它将返回未解码的字节);当然,选择文件的实际编码(我总是使用utf-8作为我的例子)。
要进一步解码文本文件f中的CSV,我建议使用标准库的csv模块:

...
    reader = csv.reader(f)
    for row in reader:
        print(row)

相关问题