在python中修改并保存csv文件

时间:2016-12-12 16:53:06

标签: python csv export-to-csv python-3.5

我有一个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

3 个答案:

答案 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文件第一行的列。

如果可能,我强烈建议您使用“;”或“,”作为列分隔符,使事情变得更容易