【问题标题】:Modifying multiple .csv files from same directory in python在python中从同一目录修改多个.csv文件
【发布时间】:2019-12-11 19:46:24
【问题描述】:

我需要修改目录中的多个 .csv 文件。有没有可能用一个简单的脚本来做到这一点? 我的 .csv 列按以下顺序排列:

X_center,Y_center,X_Area,Y_Area,分类

我想把它们改成这个顺序:

分类,X_center,Y_center,X_Area,Y_Area

到目前为止,我设法写了:

import os
import csv

for file in os.listdir("."):
    if file.endswith(".csv"):
        with open('*.csv', 'r') as infile, open('reordered.csv', 'a') as outfile:
            fieldnames = ['Classification','X_center','Y_center','X_Area','Y_Area']
            writer = csv.DictWriter(outfile, fieldnames=fieldnames)
            writer.writeheader()
            for row in csv.DictReader(infile):
                writer.writerow(row)
        csv_file.close()

但它将每一行更改为 Classification,X_center,Y_center,X_Area,Y_Area(替换每一行中的值)。 是否可以打开文件,重新排序列并以相同的名称保存文件? 我检查了其他线程上给出的类似解决方案,但没有运气。 感谢您的帮助!

【问题讨论】:

  • 你可以使用 pandas 吗? pip install pandas 如果是这样,我会在下面写一个解决方案:

标签: python csv


【解决方案1】:

首先,我认为您的问题在于在循环中打开 '*.csv' 而不是打开 file。不过,我建议永远不要覆盖您的原始输入文件。将副本写入新目录要安全得多。这是执行此操作的脚本的修改版本。

import os
import csv
import argparse

ap = argparse.ArgumentParser()
ap.add_argument("-i", "--input", required=True)
ap.add_argument("-o", "--output", required=True)
args = vars(ap.parse_args())


if os.path.exists(args["output"]) and os.path.isdir(args["output"]):
        print("Writing to {}".format(args["output"]))
else:
        print("Cannot write to directory {}".format(args["output"]))
        exit()

for file in os.listdir(args["input"]):
    if file.endswith(".csv"):
        print("{} ...".format(file))
        with open(os.path.join(args["input"],file), 'r') as infile, open(os.path.join(args["output"], file), 'w') as outfile:
            fieldnames = ['Classification','X_center','Y_center','X_Area','Y_Area']
            writer = csv.DictWriter(outfile, fieldnames=fieldnames)
            writer.writeheader()
            for row in csv.DictReader(infile):
                writer.writerow(row)
        outfile.close()

要使用它,请为您的输出创建一个新目录,然后像这样运行:

python this.py -i input_dir -o output_dir

注意: 从你的问题来看,你似乎希望每个文件都被修改到位,所以这基本上是这样做的(输出一个同名的文件,只是在不同的目录中),但你的输入不会受到伤害。如果您确实希望按照代码open('reordered.csv', 'a') 所暗示的那样将所有文件重新排序到一个文件中,您可以通过移动输出初始化代码轻松做到这一点,以便在进入循环之前执行它。

【讨论】:

    【解决方案2】:

    使用熊猫和路径库。

    from pathlib import Path # available in python 3.4 + 
    import pandas as pd
    dir = r'c:\path\to\csvs' # raw string for windows.
    csv_files = [f for f in Path(dir).glob('*.csv')] # finds all csvs in your folder.
    
    
    cols = ['Classification','X_center','Y_center','X_Area','Y_Area']
    
    for csv in csv_files: #iterate list
        df = pd.read_csv(csv) #read csv
        df[cols].to_csv(csv.name,index=False)
        print(f'{csv.name} saved.')
    

    当然,如果 csv 没有这些列,那么此代码将失败,您可以添加一个 try/except 如果是这种情况。

    【讨论】:

      猜你喜欢
      • 2020-10-05
      • 1970-01-01
      • 2018-08-12
      • 2023-02-02
      • 1970-01-01
      • 2015-05-24
      • 1970-01-01
      • 2021-01-21
      • 1970-01-01
      相关资源
      最近更新 更多