我有一个csv文件,第一行是列名。
我正在尝试从旧的csv文件中生成一个新的csv文件。
新的csv文件是通过第二列过滤原始csv文件获得的,第二列的值为HR
这是代码
import csv
import os
Filename = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\\Desktop\RosterUnified.csv"
Filename1=os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\\Desktop\RosterCurrentMonth.csv"
f1=open(Filename,'r',newline='\n')
f2=open(Filename1,'w',newline='\n')
reader = csv.DictReader(f1)
writer = csv.writer(f2)
rows = [row for row in reader if row[1] == 'HR']
for row in rows:
writer.writerow(row)
f1.close()
f2.close()
我收到错误:
Traceback (most recent call last):
File "C:\Users\dasa17\Desktop\testcsv.py", line 9, in <module>
rows = [row for row in reader if row[1] == 'HR']
File "C:\Users\dasa17\Desktop\testcsv.py", line 9, in <listcomp>
rows = [row for row in reader if row[1] == 'HR']
KeyError: 1
来自csv文件的样本,班次B,WO等对应于日期
Manager NT ID Vertical Org Employee ID 12/1/2016 12/2/2016 12/3/2016 12/4/2016 12/5/2016
johnyv GS Finance banakv B B WO WO B
johnyv GS Finance anbazh B B WO WO B
johnyv GS Finance immana B B WO WO B
immana GS Finance raosha B B WO WO B
chinj GS Finance johnyv B B WO WO B
johnyv GS Finance yeddub B B WO WO B
johnyv GS Finance sharmr25 B B WO WO B
chinj GS Finance pellan B WO WO B
johnyv GS Finance ccl B B WO WO B
johnyv GS Finance raos27 B B WO WO B
johnyv GS Finance chinns3 B B WO WO B
gopals5 IT guntuv1 B B WO WO B
goganp IT vasuds2 G G WO WO G
sharmr1 IT konakr G G C C WO
mangan IT kanumr B B WO WO B
singho1 IT nanjad G G G G G
goganp IT tandok G G WO WO G
sharmr1 IT ranjas2 D WO A A B
mangan IT poddar2 A A A A A
wongs2 IT subras24 G G WO WO G
singho1 IT sevakm G G G G G
sharmr1 IT gopalh B B WO WO A
mangan IT ramakp2 B B B B B
cohna1 IT perumk B B WO WO B
ramosj6 IT maddib G G WO WO G
singho1 IT guptar29 G G G G G
darisr IT vasudl G G WO WO G
thangk IT singhs70 L L WO WO L
subras16 IT hampas A A A A A
gordos7 IT subras16 B B B B B
omahoc IT royd1 G G WO WO G
darisr IT gandhn5 G G WO WO G
eranhm IT arasap G G WO WO G
juszkw IT patilg2 B B WO WO B
mkulkarn IT kembhp G G WO WO G
chavvp IT pinnas1 G G WO WO G
subras16 IT dhanam A A A A A
vasudl IT saralm A A A WO A
mkulkarn IT sukumk1 G B WO WO B
arorag IT sreedr G G WO WO G
subras16 IT sivasm2 B B B B B
parvar IT razdak B B WO WO L
vasudl IT jayacs1 B B WO WO A
palang1 IT vedagm B B B B B
mkulkarn IT kur5 G G WO WO G
sharmr1 IT sambaa1 A D WO WO B
chavvp IT rangak3 G G WO WO G
arorag IT suryaa1 G G WO WO G
subras16 IT kumarr27 B B B B B
Royd1 IT gavria G G WO WO G
该文件是使用代码
创建的d=open(Filename, 'w',newline='\n') #Format for CSV input
c = csv.writer(d)
c.writerow(["Manager NT ID"," Vertical Org","Employee ID" ]+ dayssl)# Write the header list of strings in the first row
for row in result_IT:
c.writerow(row)#Write output for IT to csv
d.close()
e=open(Filename, 'a',newline='\n')
f= csv.writer(e)
for row in result_Others:
f.writerow(row)# Append to the existing CSV file with non IT data
e.close()
#Close the CSV file
答案 0 :(得分:1)
我看不出你使用DictReader的原因。您正在尝试访问第二列,因此需要使用row['NT']
之类的内容,即您可以使用标题名称而不是其位置来访问它。使用标准CSV阅读器,您只需使用该位置。
我建议您使用Python的with
语句来访问文件,以确保文件在之后自动关闭(不需要close()
语句)。您还可以使用os.path.join()
将路径组件追加到一起,如下所示:
import os
import csv
input_filename = os.path.join(os.getenv("HOMEDRIVE"), os.getenv("HOMEPATH"), r"Desktop\RosterUnified.csv")
output_filename = os.path.join(os.getenv("HOMEDRIVE"), os.getenv("HOMEPATH"), r"Desktop\RosterCurrentMonth.csv")
with open(input_filename, newline='\n') as f_input, open(output_filename, 'w', newline='\n') as f_output:
csv_input = csv.reader(f_input)
csv_output = csv.writer(f_output)
#csv_output.writerow(next(csv_input)) # optionally copy over the header
for row in csv_input:
if row[1] == 'HR':
csv_output.writerow(row)
这将导致CSV输出文件仅包含第二列中HR
的行。如果您还需要标题,请取消注释该行。
通过一次处理一行,它可以使用任何文件大小,避免一次将整个文件加载到内存中。
答案 1 :(得分:0)
你有充分的理由不去,只是使用熊猫:
import pandas as pd
filename_1 = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\\Desktop\RosterUnified.csv"
filename_2 = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\\Desktop\RosterCurrentMonth.csv"
df_1 = pd.read_csv(filename_1, sep='\t', skip_blank_lines=True)
df_2 = df_1[df_1['NT'] == 'HR']
df_2.to_csv(filename_2, sep='\t', index=False)
如果filename_1
由空格而非制表符分隔,请将sep=' *'
代替sep='\t'
传递给read_csv
。
答案 2 :(得分:0)
关于KeyError
:
基本上,发生异常是因为Python认为您正在尝试访问最后一行中的nammed“1”列:
reader = csv.DictReader(f1)
writer = csv.writer(f2)
rows = [row for row in reader if row[1] == 'HR']
发生这种情况是因为您使用的是DictReader
,而您的CSV代码段中,允许的列是出现在CSV文件第一行的列。
如果可能,我强烈建议您使用“;”或“,”作为列分隔符,使事情变得更容易