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

2024-05-14 18:41:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有数百个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”)替换它时,脚本工作正常,但问题是它总是覆盖同一个文件。那么如何让脚本为每个输入文件创建一个新的输出文件呢

错误消息:

with open(r'D:\Koko Suomen ihmispaineet\Ihmispaineet_26_10_2018\Global fishing watch\fishing_effort\daily_csvs_finland\fin_{}'.format(filename), 'w') as o:

IOError: [Errno 22] invalid mode ('w') or filename: 'D:\Koko Suomen ihmispaineet\Ihmispaineet_26_10_2018\Global fishing watch\fishing_effort\daily_csvs_finland\fin_D:\Koko Suomen ihmispaineet\Ihmispaineet_26_10_2018\Global fishing watch\fishing_effort\daily_csvs\2012-01-01.csv'


Tags: 文件csvin名称formatforasopen
1条回答
网友
1楼 · 发布于 2024-05-14 18:41:11

3个问题:

  • 错误的斜杠:您需要使用

    • 带反斜杠的原始字符串r"\somedir\somefi.le"
    • 转义反斜杠:"\\somedir\\somefi.le"
    • 或者改用斜杠-它们“简单有效”:/somedir/somefi.le
  • writing the csv

  • 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    

      

相关问题 更多 >

    热门问题