2012-10-24 24 views
1

我正在嘗試設置一個系統,用戶可以登錄到Web界面並跟蹤已放置的訂單。系統將追蹤訂單從初始確認到生產,並最終在發貨前停止。 (正如我的妻子解釋的那樣:「像Domino的比薩訂單跟蹤器,但是用於名片。」)我被困在一個點,我需要從一個不斷變化的逗號分隔的.txt文件目錄解析數據。每個放置的訂單都會自動生成它自己的.txt文件,其中包含我將在Web界面上顯示的各種重要信息。例如:在Python中解析多個CSV(.txt)文件

H39TZ3.txt:

token,tag,prodcode,qty   #(These are the headers) 
,H39TZ3,pchd_4stpff,,100  #(These are the corresponding values for part 1 of the order) 
,H39TZ3,pchdn_8ststts,6420-PCNM8ST,100 #(These are values for part 2 of the order) 

有打算在任何給定的時間是向上目錄中的300個不同的.txt文件,文件將根據他們的訂單狀態來來去去(一旦發貨,文件將被存檔)我已經閱讀了代碼來解析單個文件並將值導入字典,但是我發現的所有內容都是針對單個文件的。我將如何去寫這樣的東西,只爲多個文件?

import csv 

d = {} 

for row in csv.reader(open('H39TZ3.txt')): 
    d['Order %s' % row[1]] = {'tag': row[1], 'prodcode': row[2], 'qty': row[3]} 

謝謝!

回答

3

您可以使用os.listdir()列出包含您的.txt文件的目錄的內容。像下面這樣的東西應該爲你工作:

for filename in os.listdir("."): 
    with open(filename) as csv_file: 
     for row in csv.reader(csv_file): 
      d['Order %s' % row[1]] = {'tag': row[1], 'prodcode': row[2], 'qty': row[3]} 

注意,我在裏面加了with聲明。它會確保在完成處理後關閉文件,以免浪費/耗盡文件描述符。如果目錄可能包含您感興趣的其他文件,則可以在with語句之前添加適當的過濾。

+1

我實際上使用'glob.glob('*。txt')'而不是'os.listdir()'。它使過濾文件變得容易很多。否則,會出現在目錄中出現的奇怪的二進制文件,並使整個程序死亡。 –

+0

工作很好,謝謝!祝你好運! –

3

我想補充一點,如果你想以字典的形式讀取行,csv.DictReader可能是更好的選擇。它會根據第一行(標題)自動設置字典的鍵。你會這樣使用它:

with open(filename) as csv_file: 
    for row in csv.DictReader(csv_file): 
     d['Order ' + row['tag']] = row 

由於dm03514提到,儘管如此,數據庫可能會是一個更好的選擇。 sqlite附帶Python(sqlite3模塊),您可以使用各種工具來檢查和修改數據庫。它也應該比使用單個文件更強大。

+0

這工作得很好,感謝sqlite3上的提示,我將不得不深入瞭解我的數據庫選項。 –