无法读取文件 python

Unable to read a file python

您好,我有一个 tar 文件,其中包含名为 0_data0_index 等的文件。我要做的是打开 tar 文件并通读这些文件的内容。到目前为止我能做的就是提取所有文件。我不能做的是读取单个文件的内容。我知道它们不是纯文本文件,但是如果我看不到文件的内容,我该如何解析一堆网页的文件呢?

我尝试打开文件时遇到的错误是:

return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 87: character maps to <undefined>

这是我的代码:

import os
import tarfile

def is_tarfile(file):
return tarfile.is_tarfile(file)

def extract_tarfile(file):
    if is_tarfile(file):
        my_tarfile=tarfile.open(file)
        my_tarfile.extractall("c:/untar")
        read_files_nz2("c:/untar/nz2_merged");
        return 1
    return 0

def read_files_nz2(file):
    for subdir, dirs, files in os.walk(file):
        for i in files:
             path = os.path.join(subdir,i)
             print(path)
             content=open(path,'r')
             print (content.read())

extract_tarfile("c:/nz2.tar")

print(i)会输出文件名,但是print(content.read())会报错:

return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 87: character maps to <undefined>

我希望有人能帮助我从文件中读取数据

我不是 100% 确定这是你的问题,但这至少是一种不好的做法,并且可能是你问题的根源。

您没有关闭任何打开的文件。例如你有:

my_tarfile=tarfile.open(file)

但在那之后的某处,在您打开另一个文件之前,您应该:

my_tarfile.close()

引用自diveintopython

Open files consume system resources, and depending on the file mode, other programs may not be able to access them. It's important to close files as soon as you're finished with them.

我的想法是因为您从未关闭 my_tarfile 系统无法正确读取从中提取的文件。即使这不是问题,最好尽快关闭文件。

您需要完整的文件路径才能访问它,而不仅仅是名称。 您的第二个函数应如下所示:

def read_files_nz2(file):
for subdir, dirs, files in os.walk(file):
    for i in files:
        path = os.path.join(subdir, f) # Getting full path to the file
        content=open(path,'r')
        print (content.read())

您需要做以下两件事之一:

  • 打开文件时指定编码:

    # This is probably not the right encoding.
    content = open(path, 'r', encoding='utf-8')
    

    为此,您需要知道文件的编码是什么。

  • 二进制模式打开文件:

    content = open(path, 'rb')
    

    这将导致读取到 return bytes 对象而不是字符串,但它会避免任何解码或验证单个字节的尝试。

我不确定问题所在 但这种情况发生在我身上,它使用这种编码解决了

with open(path, 'r', encoding="ISO-8859-1") as f:
    content = f.read()

另一个好方法是用 UTF-8 重写你的文件,检查这个代码

with open(ff_name, 'rb') as source_file:
  with open(target_file_name, 'w+b') as dest_file:
    contents = source_file.read()
    dest_file.write(contents.decode('utf-16').encode('utf-8'))