有很多方法可以以不同的方式读取文件。
Just plainopen
将获取一个文件名并将其作为一系列行打开。或者,您可以调用read()
它,它会立即将整个文件读入一个巨大的字符串。
codecs.open
将采用文件名和字符集,并自动将每一行解码为 Unicode。或者,同样,您可以调用read()
它,它会立即读取整个文件并将其解码为一个巨大的 Unicode 字符串。
csv.reader
将获取一个文件或类似文件的对象,并将其作为一系列 CSV 行读取。没有直接的等价物read()
——但是你可以通过调用它来将任何序列变成一个列表list
,所以list(my_reader)
会给你一个行列表(每个行本身就是一个列表)。
zipfile.ZipFile
将获取文件名、文件或类似文件的对象,并将其作为 ZIP 存档读取。当然,这不会逐行进行,但是您可以逐个归档文件进行归档。或者你可以做一些更有趣的事情,比如按名称搜索存档文件。
有用于读取 JSON 和 XML 文档的模块,处理二进制文件的不同方式等等。其中一些工作方式不同——例如,您可以使用一个模块将 XML 文档搜索为一棵树,或者使用不同的模块逐个元素地搜索 XML 文档。
Python 有一个相当广泛的标准库,你可以在网上找到文档。每个看起来应该能够处理文件的模块,可能都可以。
而且,除了标准库PyPI 中的内容之外,Python 包索引还有数千个附加模块。正在寻找一种阅读 YAML 文档的方法?搜索 PyPI yaml
,你会找到它。
最后,Python 可以很容易地自己添加这样的东西。像这样的函数的骨架csv.reader
很简单:
def reader(fileobj):
for line in fileobj:
yield parse_one_csv_line(line)
你可以parse_one_csv_line
用任何你想要的东西来替换它,而且你有一个自定义阅读器。例如,这是一个大写阅读器:
def uppercase_reader(fileobj):
for line in fileobj:
yield line.upper()
实际上,您甚至可以将整个内容写在一行中:
shouts = (line.upper() for line in fileobj)
最好的事情是,只要你的阅读器一次只产生一行,你的阅读器本身就是一个类似文件的对象,所以你可以传递uppercase_reader(fileobj)
给csv.reader
它并且它工作得很好。