Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 导入csv:从第一行的列名中删除文件名_Python_String_Csv_Replace - Fatal编程技术网

Python 导入csv:从第一行的列名中删除文件名

Python 导入csv:从第一行的列名中删除文件名,python,string,csv,replace,Python,String,Csv,Replace,我正在使用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 Street

我正在使用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
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)
Streetname ZIPCode
Street1 9999
Street2 9848

Name Phone
Name1 23421
Name2 23232
我正在使用以下代码处理这些文件(我正在从源文件夹读取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)
            writer.writerows(rows)
(此代码有效)提供

第一行包含标题。在头文件名中,总是有文件名(但是没有099_2019_01_01_.前缀)加上“-”。缺少以.csv结尾的文件名。我想删除每个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
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)
Streetname ZIPCode
Street1 9999
Street2 9848

Name Phone
Name1 23421
Name2 23232
  • 我可以从一个函数开始,切断前n个符号,因为长度是固定的,或者
  • 根据解决方案,只需使用
    string.removeprefix('099\u 2019\u 01\u 01')
  • 因为我有Python3.5,所以我不能使用removeprefix,所以我尝试简单地替换它

    字符串。替换(“099_2019_01_01_

    然后我需要删除.csv,这很容易:

    string.replace(".csv","")
    
    我把这些放在一起,得到了
    (string.replace(“099\u 2019\u 01\u 01”),replace(“csv”),”)
    。(加上结尾的“-”也需要删除,请参见下面的代码)。我不确定这是否有效

    我现在的主要问题是,对于这个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
    
    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)
    
    Streetname ZIPCode
    Street1 9999
    Street2 9848
    
    Name Phone
    Name1 23421
    Name2 23232
    
    这会产生一个错误,因为行[0]的想法不起作用。我该怎么做

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

    请注意,我确实希望使用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
    
    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)
    
    Streetname ZIPCode
    Street1 9999
    Street2 9848
    
    Name Phone
    Name1 23421
    Name2 23232
    
    尝试替换以下内容:

    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]
    这应该是一个小列表,只需将其粘贴到此处,这将有很大帮助Hanks,我更新了我的答案,请再次检查我的建议也将动态运行,您是否根据我的答案替换了代码?在将行保存到目标csv之前,行将被更新或替换,对于每个文件名,您最好粘贴一个“r”示例“ows”是根据您的原始代码生成的,因此我将检查它的结构。根据此结构,我将调整解决方案。您希望您的列仅为Streetname和ZIPCode?我明白了。请检查我的答案的新版本。如果不起作用,我建议将单词与“-”分开,并保留最后一部分。