Python 导入csv:从第一行的列名中删除文件名
我正在使用Python 3.5。我有几个csv文件: 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
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
string.removeprefix('099\u 2019\u 01\u 01')
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?我明白了。请检查我的答案的新版本。如果不起作用,我建议将单词与“-”分开,并保留最后一部分。