我在R中编程但是在这个项目中我正在使用python。
在RI中我了解到我应该避免使用for loops
到apply
方法来获得更快的运行时间(以及更简单的代码编写),但是我在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'
答案 0 :(得分:1)
实际上没有必要避免python中的循环。但如果你想这样做,你可以选择:
地图示例(就像@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())
目前还不清楚你想要对输出做什么,但是你可以修改循环中的代码,具体取决于你想用它做什么。