Python在每个子目录中创建和编辑文件
我有一个包含子文件夹的主文件夹,每个子文件夹包含具有特定命名方案的文件。我已经对一个函数进行了单元测试,该函数用于根据这些文件中的信息在单个目录中创建和编辑文本文档,但现在在尝试使该函数迭代每个子目录时遇到了问题 问题: 我在过滤器:中的第38行Python在每个子目录中创建和编辑文件,python,csv,python-3.x,os.walk,Python,Csv,Python 3.x,Os.walk,我有一个包含子文件夹的主文件夹,每个子文件夹包含具有特定命名方案的文件。我已经对一个函数进行了单元测试,该函数用于根据这些文件中的信息在单个目录中创建和编辑文本文档,但现在在尝试使该函数迭代每个子目录时遇到了问题 问题: 我在过滤器:中的第38行if(第[“r_id”]行)中得到一个“keyrerror”。这是因为没有创建文件br_ids.csv。在单元测试中,它运行良好,因此我只能假设它与我如何使用os.walk有关 代码: import csv import os with open('h
if(第[“r_id”]行)中得到一个“keyrerror”。这是因为没有创建文件br_ids.csv
。在单元测试中,它运行良好,因此我只能假设它与我如何使用os.walk有关
代码:
import csv
import os
with open('hasf.txt','w') as hf:
for root, subFolders, files in os.walk('/path/to/topdir/'):
#if folder contains 'f_r.csv', list the path in 'hasf.txt'
if 'f_r.csv' in files:
hf.write("%s\n" % root)
if 'r.csv' in files:
with open(os.path.join(root, "r.csv")) as inf, open(os.path.join(root, "br_ids.csv"), "w") as output:
reader = csv.DictReader(inf, quotechar='"')
headers = ["r_id"]
writer_br = csv.DictWriter(output, headers, extrasaction='ignore')
writer_br.writeheader()
for row in reader:
if int(row["r_type"]) == 3:
writer_br.writerow(row)
# End creating br_ids
# parse the data you're about to filter with
with open(os.path.join(root, 'br_ids.csv'), 'r') as f:
filters = {(row["r_id"]) for row in csv.DictReader(f, delimiter=',', quotechar='"')}
with open(os.path.join(root, 'bt_ids.csv'), 'w') as out_f:
headers = ["t_id"]
out = csv.DictWriter(out_f, headers, extrasaction='ignore')
out.writeheader()
# go thru your rows and see if the matching(row[r_id]) is
# found in the previously parsed set of filters; if yes, skip the row
with open(os.path.join(root, 't.csv'), 'r') as f:
for row in csv.DictReader(f, delimiter=','):
if (row["r_id"]) in filters:
out.writerow(row)
我在这里遇到了一些类似的问题,但没有一个直接涉及到在os.walk
的每个位置中创建、编辑和使用文件。这是我第一次使用Python,我有点不知所措。此外,如果有任何方法可以让我的其他代码更具Python风格,我会洗耳恭听
谢谢 事实证明,问题直接是KeyError——在一些文件夹中,br_id.csv
没有条目,因此引发了KeyError。我解决这个问题的方法是使用try
,如下所示:
# parse the data you're about to filter with
with open(os.path.join(root, 'br_ids.csv'), 'r') as f:
filters = {(row["r_id"]) for row in csv.DictReader(f, delimiter=',', quotechar='"')}
with open(os.path.join(root, 'bt_ids.csv'), 'w') as out_f:
headers = ["t_id"]
out = csv.DictWriter(out_f, headers, extrasaction='ignore')
out.writeheader()
# go thru your rows and see if the matching(row[r_id]) is
# found in the previously parsed set of filters; if yes, skip the row
with open(os.path.join(root, 't.csv'), 'r') as f:
for row in csv.DictReader(f, delimiter=','):
try:
if (row["r_id"]) in filters:
out.writerow(row)
except KeyError:
continue
在另一个例子中,我有一个if(row[“r_id”])不在过滤器中:
,并使用相同的方法绕过它,除了如果它返回KeyError
,则它继续执行并执行out.writerow(row)
好吧,你是说br_id.csv没有创建,这导致了错误,但如果未创建此文件,则代码必须已在第行失败,并将open(os.path.join(root,'br_ids.csv'),'r')作为f:
。