【问题标题】:Import csv: remove filename from column names in first row导入 csv:从第一行的列名中删除文件名
【发布时间】:2024-01-25 14:17:01
【问题描述】:

我正在使用 Python 3.5。我有几个 csv 文件:

csv 文件根据固定结构命名。它们有一个固定的前缀(总是相同的)加上不同的文件名部分:

099_2019_01_01_filename1.csv
099_2019_01_01_filename2.csv

我的原始 csv 文件如下所示:

filename1-Streetname filename1-ZIPCODE
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
Street1 2012932
Street2 3023923

filename2-Name filename2-Phone
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
Name1 2012932
Name2 3023923

我正在使用以下代码操作这些文件(我正在从源文件夹读取 csv 文件并将它们写入目标文件夹。我正在跳过某些行,因为我不想包含此信息):

我切断了 TEXT 行,因为我不需要它们:

import csv
    
skiprows = (1,2,3,4,5,6)
for file in os.listdir(sourcefolder):
    with open(os.path.join(sourcefolder,file)) as fp_in:
        reader = csv.reader(fp_in, delimiter=';')
        rows = [row for i, row in enumerate(reader) if i not in skiprows]
        with open(os.path.join(destinationfolder,file), 'w', newline='') as fp_out:
            writer = csv.writer(fp_out)
            writer.writerows(rows)

(此代码有效)给出

filename1-Streetname filename1-ZIPCODE
Street1 2012932
Street2 3023923

filename2-Name filename2-Phone
Name1 2012932
Name2 3023923

第一行包含标题。在标题名称中总是有文件名(但没有 099_2019_01_01_ 前缀)加上“-”。缺少以 .csv 结尾的文件名。我想为每个 csv 文件删除这个“文件名-”。

现在的核心部分是获取第一行并且只为这一行执行替换。我需要切断前缀和 .csv,然后执行一般替换。第一个替换可能是这样的:

  1. 我可以从一个函数开始,因为长度是固定的,以切断前 n 个符号,或者
  2. 根据this 的解决方案,只需使用string.removeprefix('099_2019_01_01_')

因为我有 Python 3.5,所以我不能使用 removeprefix,所以我尝试简单地替换它。

string.replace("099_2019_01_01_","")

然后我需要删除 .csv 这很简单:

string.replace(".csv","")

我把它放在一起,我得到了(string.replace("099_2019_01_01_","")).replace(".csv","")。 (加上最后的“-”也需要删除,见下面的代码)。我不确定这是否有效。

我现在的主要问题是这个 csv 导入代码,我不知道如何在读取/写入 csv 时只操作第一行。所以我只想在第一行替换它。我尝试过这样的事情:

import csv
    
skiprows = (1,2,3,4,5,6)
for file in os.listdir(sourcefolder):
    with open(os.path.join(sourcefolder,file)) as fp_in:
        reader = csv.reader(fp_in, delimiter=';')
        rows = [row for i, row in enumerate(reader) if i not in skiprows]
        with open(os.path.join(destinationfolder,file), 'w', newline='') as fp_out:
            writer = csv.writer(fp_out)
            rows[0].replace((file.replace("099_2019_01_01_","")).replace(".csv","")+"-","")
            writer.writerows(rows)

这会产生错误,因为 rows[0] 的想法不起作用。我该怎么做?

(我不确定是否应该尝试在代码中包含此替换或将其放入在第一个代码之后运行的第二个代码中。但是,我假设我会再次读写 csv 文件。所以我认为将它实现到这段代码中是最有效的。否则我需要再次打开并更改并保存每个文件。但是,如果无法将它包含到这段代码中,我也可以使用运行 stand 的代码- 单独进行替换,假设 csv 文件将第 0 行作为标题,然后数据来了。)

请注意,我确实想使用 csv 而不是使用 pandas。

编辑: 最后,csv 文件应如下所示:

Streetname ZIPCode
Street1 9999
Street2 9848

Name Phone
Name1 23421
Name2 23232

【问题讨论】:

    标签: python string csv replace


    【解决方案1】:

    尝试替换这个:

    rows[0].replace((file.replace("099_2019_01_01_","")).replace(".csv","")+"-","")
    

    在你的代码中:

    x=file.replace('099_2019_01_01_','').replace('.csv', '')
    rows[0]=[i.replace(x+'-', '') for i in rows[0]]
    

    【讨论】:

    • 我的意思是从这一行产生的行:rows = [row for i, row in enumerate(reader) if i not in skiprows]应该是一个小列表,把它贴在这里,会有很大帮助
    • 谢谢,我更新了答案,请再次查看
    • 我的建议也将动态运行,您是否根据我的回答替换了代码?行将在保存到目标 csv 之前被更新替换,对于每个文件名您最好粘贴从原始代码生成的“行”示例,以便我检查它的结构。根据这个结构,我会调整解决方案
    • 您希望您的列只是 Streetname 和 ZIPCode?​​span>
    • 我明白了。请检查我的答案的新版本。如果它不起作用,我建议只用'-'分割单词并保留最后一部分。
    最近更新 更多