1

我正在尝试建立一个系统,用户可以在其中登录 Web 界面并跟踪已下达的订单。系统将跟踪订单从最初的确认到生产,最后在发货前停止。(正如我妻子解释的那样:“就像 Domino's Pizza 订单跟踪器,但用于名片。”)我被困在需要从逗号分隔的 .txt 文件不断变化的目录中解析数据的地步。下的每个订单都会自动生成它自己的 .txt 文件,其中包含我将在 Web 界面上显示的各种重要信息。例如:

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]}

谢谢!

4

2 回答 2

4

您可以使用列出包含文件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语句之前添加适当的过滤。

于 2012-10-24T19:06:28.410 回答
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模块),您可以使用各种工具来检查和修改数据库。它也应该比使用单个文件更健壮。

于 2012-10-24T19:09:28.890 回答