我已经能够使用这个网站上其他用户的输入,用 Python 创建了一个 csv 文件,并对此表示感谢。现在我遇到了难题,并将发布我的第一个问题。
我的 input.csv 文件长这样:
day,month,year,lat,long
01,04,2001,45.00,120.00
02,04,2003,44.00,118.00
我想删除"year"列及其所有项。总共有40多个条目,年份范围从1960-2010年不等。
我已经能够使用这个网站上其他用户的输入,用 Python 创建了一个 csv 文件,并对此表示感谢。现在我遇到了难题,并将发布我的第一个问题。
我的 input.csv 文件长这样:
day,month,year,lat,long
01,04,2001,45.00,120.00
02,04,2003,44.00,118.00
我想删除"year"列及其所有项。总共有40多个条目,年份范围从1960-2010年不等。
import csv
with open("source","rb") as source:
rdr= csv.reader( source )
with open("result","wb") as result:
wtr= csv.writer( result )
for r in rdr:
wtr.writerow( (r[0], r[1], r[3], r[4]) )
顺便提一下,for
循环可以被移除,但并不会真正简化代码。
in_iter= ( (r[0], r[1], r[3], r[4]) for r in rdr )
wtr.writerows( in_iter )
另外,您可以以超字面的方式坚持删除列的要求。我认为这通常是一个不好的策略,因为它不适用于删除多列。当您尝试删除第二列时,您会发现位置已经全部移动,结果行并不明显。但对于仅有一列的情况,这是可行的。
del r[2]
wtr.writerow( r )
(r[0], r[1], r[3], r[4])
替换为类似于tuple(r[ii] for ii in range(len(r)) if ii != 2)
的内容来为更大的CSV文件节省一些编写时间。 - srcerer使用Pandas模块会更加容易。
import pandas as pd
f=pd.read_csv("test.csv")
keep_col = ['day','month','lat','long']
new_f = f[keep_col]
new_f.to_csv("newFile.csv", index=False)
这里有个简短的解释:
>>>f=pd.read_csv("test.csv")
>>> f
day month year lat long
0 1 4 2001 45 120
1 2 4 2003 44 118
>>> keep_col = ['day','month','lat','long']
>>> f[keep_col]
day month lat long
0 1 4 45 120
1 2 4 44 118
>>>
read_csv
中传递dtype=str
来防止这种情况在较新的pandas版本中发生。 - ntjessimport csv
ct = 0
cols_i_want = {'cost' : -1, 'date' : -1}
with open("file1.csv","rb") as source:
rdr = csv.reader( source )
with open("result","wb") as result:
wtr = csv.writer( result )
for row in rdr:
if ct == 0:
cc = 0
for col in row:
for ciw in cols_i_want:
if col == ciw:
cols_i_want[ciw] = cc
cc += 1
wtr.writerow( (row[cols_i_want['cost']], row[cols_i_want['date']]) )
ct += 1
列号
。f = pd.read_csv("test.csv", usecols=[0,1,3,4])
f.to_csv("test.csv", index=False)
del variable_name['year']
您可以使用csv
包遍历CSV文件并将所需的列输出到另一个CSV文件中。
下面的示例未经过测试,但应该说明了解决方案:
import csv
file_name = 'C:\Temp\my_file.csv'
output_file = 'C:\Temp\new_file.csv'
csv_file = open(file_name, 'r')
## note that the index of the year column is excluded
column_indices = [0,1,3,4]
with open(output_file, 'w') as fh:
reader = csv.reader(csv_file, delimiter=',')
for row in reader:
tmp_row = []
for col_inx in column_indices:
tmp_row.append(row[col_inx])
fh.write(','.join(tmp_row))
tmp_row
和 join
,改用 csv.writer
和生成器表达式:for row in reader: wtr.writerow(row[i] for i in column_indices)
。这样更安全(自动处理引号),更简洁,更快。 - Steven Rumbalskicsv
进行写入呢? - S.Lott凭借我个人的经验,这样做可以完成任务,但是没有任何错误检查或配置能力。这些都需要读者自行处理。
outFile = open( 'newFile', 'w' )
for line in open( 'oldFile' ):
items = line.split( ',' )
outFile.write( ','.join( items[:2] + items[ 3: ] ) )
outFile.close()
我将为这个问题添加另一个答案。由于OP没有说明他们需要使用Python来完成,所以最快的删除列的方法(特别是当输入文件有成千上万行时),是使用awk
。
这是awk发挥作用的类型问题:
$ awk -F, 'BEGIN {OFS=","} {print $1,$2,$4,$5}' input.csv
如果需要将输出保存到文件中,可以在上述命令后面添加> output.csv
。
所有的荣誉归功于@eric-wilson,他在10年前作为对原问题的评论提供了这个非常棒的答案,几乎没有得到任何认可。
result= data.drop('year', 1)
result.head(5)
input = [ {'day':01, 'month':04, 'year':2001, ...}, ... ]
for E in input: del E['year']
input = [ [01, 04, 2001, ...],
[...],
...
]
for E in input: del E[2]
awk
的问题:$ awk -F, 'BEGIN {OFS=","} {print $1,$2,$4,$5}' ex.csv
。其中awk
可以很好地处理这种问题,该命令将以逗号作为分隔符,选取CSV文件中第一、二、四、五列,并输出到标准输出流中。 - Eric Wilsoncsv
是最好的选择。我只在明显可行且只有一行时才使用awk
。 - Eric Wilson