我有一个包含数百个csv文件的文件夹,每个文件中包含国家名称的每一行。我想遍历所有文件,选择国家名称为“ FIN”的行,然后从所选行中创建新的csv文件。
这是我走了多远:
import csv
import glob
for filename in glob.glob('\directory\*.csv'):
with open(filename, 'r') as i, open('\directory_for_new_files\fin_{}'.format(filename), 'w') as o:
r = csv.reader(i, delimiter=',')
w = csv.writer(o, delimiter=',')
for row in r:
if 'FIN' in row[3] or 'flag' in row[3] :
w.writerow(row)
"fin_{}'.format(filename)"
部分似乎是问题所在,因为当我只用一个名称(例如'testfile.csv')替换脚本时,脚本就可以工作,但是当然存在不断覆盖相同文件的问题。那么如何获取脚本为每个输入文件创建一个新的输出文件?
错误消息:
打开(r'D:\ Koko Suomen ihmispaineet \ Ihmispaineet_26_10_2018 \ Global 钓鱼 watch \ fishing_effort \ daily_csvs_finland \ fin _ {}'。format(filename),'w') 如o:
IOError:[Errno 22]无效模式('w')或文件名:'D:\ Koko Suomen ihmispaineet \ Ihmispaineet_26_10_2018 \全球捕鱼 watch \ fishing_effort \ daily_csvs_finland \ fin_D:\ Soko Suomen ihmispaineet \ Ihmispaineet_26_10_2018 \全球捕鱼 watch \ fishing_effort \ daily_csvs \ 2012-01-01.csv'
答案 0 :(得分:1)
3个问题:
反斜杠:您需要使用
r"\somedir\somefi.le"
或"\\somedir\\somefi.le"
/somedir/somefi.le
您忘记在writing the csv时指定newline=""
glob返回带有路径的文件名-您只需要文件名。
固定示例:
import csv
import glob
# create demo files
for k in "abc":
with open("./{}.csv".format(k),"w") as f:
f.write(k+",b,c,FIN,d\n")
f.write(k+",b,c,not,d\n")
f.write(k+",b,c,flag,d\n")
# import / read / create new files:
import os
extract = {'FIN','flag'}
for filename in glob.glob('./*.csv'):
_, fn = os.path.split(filename) # fix here
with open(filename, 'r') as i, \
open('./fin_{}'.format(fn), 'w', newline="") as o: # 2 fixes here
r = csv.reader(i, delimiter=',')
w = csv.writer(o, delimiter=',')
for row in r:
if row[3] in extract: # improvement
w.writerow(row)
# test creation and content
for filename in glob.glob('./*.csv'):
print(filename)
with open(filename) as f:
print(f.read())
print("------------")
输出:
./a.csv
a,b,c,FIN,d
a,b,c,not,d
a,b,c,flag,d
------------
./b.csv
b,b,c,FIN,d
b,b,c,not,d
b,b,c,flag,d
------------
./c.csv
c,b,c,FIN,d
c,b,c,not,d
c,b,c,flag,d
------------
./fin_a.csv
a,b,c,FIN,d
a,b,c,flag,d
------------
./fin_b.csv
b,b,c,FIN,d
b,b,c,flag,d
------------
./fin_c.csv
c,b,c,FIN,d
c,b,c,flag,d
------------