从许多csv文件中选择行并创建新文件

时间:2018-11-07 13:52:56

标签: python csv

我有一个包含数百个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'

1 个答案:

答案 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    

------------