将多个csv文件合并为一个



我有大约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

相关内容

  • 没有找到相关文章

最新更新