我有大约20个csv文件(都有标题),我想把它们合并成一个csv文件。
在网上,我发现一种方法是使用终端命令:
cat *.csv > file.csv
这工作得很好,但问题是,由于所有的csv文件都带有头文件,这些头文件也被放在csv文件中。
是否有一个终端命令或python脚本上,我可以合并所有这些csv文件成一个,只保留一个头?
Thank you so much
我倾向于Awk的解决方案,但由于这个问题明确地询问了Python,这里有一个解决方案。
import csv
import sys
writer = csv.writer(sys.stdout)
firstfile = True
for file in sys.argv[1:]:
with open(file, 'r') as rawfile:
reader = csv.reader(rawfile)
for idx, row in enumerate(reader):
# enumerate() is zero-based by default; 0 is first line
if idx == 0 and not firstfile:
continue
writer.writerow(row)
firstfile = False
用法:python script.py first.csv second.csv etc.csv >final.csv
这个简单的脚本并没有真正受益于Python的任何特性,但是如果你需要计算非平凡CSV文件中的字段数(例如,带引号的字段可能包含逗号,而不是分隔符),这在Awk中很难,在Python中也很简单(因为csv
库已经知道如何处理这个问题)。
您可以使用awk
:
awk '(NR == 1) || (FNR > 1)' *.csv > file.csv
FNR
表示当前文件中的记录号(一般为行号),NR
表示总记录号。因此,第一个文件的第一行被接受,后续文件的第一行被忽略。
这是假设你所有的csv文件有相同的列数和相同的顺序。
这个命令应该可以为您工作:
tail -qn +2 *.csv > file.csv
但是,请注意,您需要在每个文件的末尾有一个额外的空行,否则这些文件将在同一行1, 12, 2
而不是第1行的1, 1
和第2行的2, 2
中连接。
下面的代码是为我工作的。
import csv
from datetime import datetime
import glob
Time = datetime.now()
Time = Time.strftime("%Y%B%d""_""%H%M")
inputFiles = [] #[i for i in glob.glob('*.{}'.format(extension))]
for file in glob.glob("*.csv"):
inputFiles.append(file)
print(inputFiles)
with open("combined" + Time + '.csv', 'xb') as csvfile:
filewriter = csv.writer(csvfile, delimiter=',',quotechar='|', quoting=csv.QUOTE_MINIMAL)
outputFile = "combined" + Time + '.csv'
for file in inputFiles:
f = open(file, "r") # set f as opening the given csv in the same file location
reader = csv.reader(f) # set reader as a readable copy of the csv
rows = [] # set rows as an empty list
for (
row
) in (
reader
): # for every row in reader, try to append a new row in our rows list, and if now, pass
try:
with open(outputFile, "a", newline="") as g:
# create a csv writer
writer = csv.writer(g)
# write the account number and the docket to the csv file
writer.writerow(row)
except:
pass