2017-08-02 140 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