2017-08-02 146 views
-3

我在R编程,但在这个项目中,我正在使用Python。Python地图读取多个.txt文件

在R我了解到,我应该避免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: mode string must begin with one of 'r', 'w', 'a' or 'U', not 'ISO-8859-1'

IOError: [Errno 2] No such file or directory: 'r'

+1

'map'只是一个美化'for'循环。 – ForceBru

+1

不要害怕在python中使用for循环。与R不同,它是做事的常用方式。 –

+0

'f = map(lambda x:codecs.open(x,“r”,“ISO-8859-1”).read(),texts)'。您需要实际将文件名称提供给打开的函数。 – Abdou

回答

1

循环Python中的速度远远超过他们在R和在许多情况下,更容易和首选方法。

我会解决这个问题的方式将是一个for循环和一个with open(...)循环。

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

目前尚不清楚你想要的输出做什么,但你会取决于你想用它做什么修改循环内的代码。

1

这真的没有必要,以避免蟒蛇循环。但是,如果你想这样做,你有一个选择:

  • 地图
  • 列表理解
  • 发电机

图示例,(如已经@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