2014-06-23 61 views
1

我正在編寫一個Python代碼,希望能更深入地瞭解如何解決這個問題。如何從一個目錄中的多個文件讀取和寫入? Python

我想讀取多個文件,以.log結尾。有了這個,我希望將具體的值寫入.csv文件。

在文本文件中,有被提取下面X/Y值:

Textfile.log:

X/Y = 5 
    X/Y = 6 

Textfile.log.2:

X/Y = 7 
    X/Y = 8 

DesiredOutput在CSV文件:

5   
    6 
    7 
    8 

下面是代碼,我拿出這麼遠:

def readfile(): 
    import os 
    i = 0 
    for file in os.listdir("\mydir"): 
     if file.endswith(".log"): 
      return file 

    def main(): 
      import re 
     list = [] 
     list = readfile() 

     for line in readfile(): 
      x = re.search(r'(?<=X/Y =)\d+', line) 
      if x: 
       list.append(x.group()) 
      else: 
       break 
     f = csv.write(open(output, "wb")) 
     while 1: 
      if (i>len(list-1)): 
       break 
      else: 
       f.writerow(list(i)) 
       i += 1 

    if __name__ == '__main__': 
    main() 

我對如何使它讀取.log文件,然後將.log.2文件混淆。 是否可以讓它自動讀取1個目錄中的所有文件,而無需單獨鍵入它們?

更新:我使用的是Windows 7和Python V2.7

回答

1

最簡單的方式來讀取順序文件是建立在它的列表,然後循環。喜歡的東西:

for fname in list_of_files: 
    with open(fname, 'r') as f: 
     #Do all the stuff you do to each file 

這樣,不管你做什麼,以讀取每個文件將被重複和list_of_files應用到每一個文件。由於列表是有序的,它將按照列表排序的順序進行。

從@The2ndSon的答案借用,你可以拿起os.listdir(dir)的文件。這將以任意順序列出dir中的所有文件和目錄。從此,你可以拉出來和秩序所有的文件是這樣的:

allFiles = os.listdir(some_dir) 
logFiles = [fname for fname in allFiles if "log" in fname.split('.')] 
logFiles.sort(key = lambda x: x.split('.')[-1]) 
logFiles[0], logFiles[-1] = logFiles[-1], logFiles[0] 

上面的代碼將與文件名工作像"somename.log", "somename.log.2"等。然後您可以採取logFiles並將其作爲list_of_files插入。請注意,最後一行僅在第一個文件是"somename.log"而不是"somename.log.1"時是必需的。如果第一個文件對最終的數字,只是排除最後一步

逐行解釋:

  • allFiles = os.listdir(some_dir)

這一行需要內some_dir和所有文件和目錄將它們作爲列表返回

  • logFiles = [fname for fname in allFiles if "log" in fname.split('.')]

執行列表理解,收集名稱中包含log的所有文件作爲擴展的一部分。將包括"something.log.somethingelse""log_something.somethingelse"不會。

  • logFiles.sort(key = lambda x: x.split('.')[-1])

排序的日誌文件在地方由過去的擴展列表。 x.split('.')[-1]將文件名分割成周期分隔值列表並取最後一個條目。如果名字是"name.log.5",它將被排序爲"5"。如果名字是"name.log",它將被排序爲"log"

  • logFiles[0], logFiles[-1] = logFiles[-1], logFiles[0]

交換的日誌文件列表中的第一個和最後一個條目。這是必要的,因爲排序操作會將"name.log"作爲最後一項,並將"nane.log.1"作爲第一項。

+0

啊我明白了,這很有道理。雖然我對list_of_files部分有點困惑。編譯器會如何知道如何依次讀取Textfile.log和Textfile.log.2? – user3685687

+0

是否有可能讓它自動讀取所有文件而無需單獨鍵入它們? – user3685687

+0

@ user3685687,是的,python能夠讀取給定目錄中的文件。一旦你的名單,你可以[很容易排序](https://wiki.python.org/moin/HowTo/Sorting),但是你想 – wnnmaw

1

如果更改日誌文件的命名方案,您可以輕鬆地返回具有「.log」擴展名的文件列表。例如,如果您更改文件名Textfile1.log和Textfile2.log可以ReadFile的更新()是:

import os 
def readfile(): 
    my_list = [] 

    for file in os.listdir("."): 
     if file.endswith(".log"): 
      my_list.append(file) 

打印my_list將返回[ 'Textfile1.log', 'Textfile2.log']。通常可以避免使用單詞'list'作爲變量,因爲它也用於python中的對象。

+0

我明白了,不幸的是,這是部分分配。我希望file.endswith可採取的整數,但它不會:( – user3685687

+0

我會wnnmaw的答案。謝謝採納您的文件讀取方法很多@ The2ndSon – user3685687

相關問題