Python map可读取多个.txt文件

时间:2017-08-02 15:49:26

标签: python python-2.7 text

我在R中编程但是在这个项目中我正在使用python。

在RI中我了解到我应该避免使用for loopsapply方法来获得更快的运行时间(以及更简单的代码编写),但是我在python中遇到了这个问题。

我有一个包含如下文本文件名的数组:

texts = ["a.txt", "b.txt", "c.txt"]

我正在读这样的文件(注意编解码器是必需的):

f = codecs.open(texts[0], "r", "ISO-8859-1").read()

我想要的是要阅读的“a.txt”,“b.txt”和“c.txt”,我尝试的是:

f = map(codecs.open("r", "ISO-8859-1").read(), texts)

但它不起作用,而for loop是不可行的,因为我有很多文件和文件夹。

我解决了这段代码,我得到的错误是:

  

ValueError:模式字符串必须以'r','w','a'或'U'之一开头,   不是'ISO-8859-1'

  

IOError:[Errno 2]没有这样的文件或目录:'r'

2 个答案:

答案 0 :(得分:1)

实际上没有必要避免python中的循环。但如果你想这样做,你可以选择:

  • 地图
  • list comprehensions
  • 发电机

地图示例(就像@Abdou在评论中写的那样):

open_fn = lambda text: codecs.open(text, "r", "ISO-8859-1").read()
f = map(open_fn, texts)

在这种情况下,你会得到一个地图对象,你可以迭代它。

列表理解:

open_fn = lambda text: codecs.open(text, "r", "ISO-8859-1").read()
files = [open_fn(text) for text in texts]

您将获得包含数据的列表。

发电机

open_fn = lambda text: codecs.open(text, "r", "ISO-8859-1").read()
files = (open_fn(text) for text in texts)

您将获得一个生成器对象。

此外,您应该记住,您只能在地图和生成器上迭代一次。并且在列表中可以包含多少。

另外,您可以阅读更多信息here

答案 1 :(得分:1)

Python中的循环比R中的循环快得多,并且在许多情况下是更容易和首选的方法。

我解决这个问题的方法是使用for循环和with open(...)循环。

for text in texts:
    with open(text, 'r') as file: # 'r' is for read mode
        print(file.read())

目前还不清楚你想要对输出做什么,但是你可以修改循环中的代码,具体取决于你想用它做什么。