使用Python在csv文件中将两行合并为一行



我正在尝试将csv文件中的多行组合在一起。我可以在Excel中很容易地做到这一点,但我想为数百个文件做这件事,所以我需要它作为一个代码。我曾尝试将行存储在数组中,但似乎不起作用。我用Python来做。

假设我有一个csv文件;

1,2,3
4,5,6
7,8,9

我想做的就是有一个csv文件,如下所示;

1,2,3,4,5,6,7,8,9

我尝试过的代码是这样的;

fin = open("C:\1.csv", 'r+')
fout = open("C:\2.csv",'w')
for line in fin.xreadlines():
new = line.replace(',', ' ', 1)
fout.write (new)
fin.close()
fout.close()

你能帮忙吗?

您应该使用csv模块,因为在逗号上手动拆分CSV非常容易出错(单列可以包含带逗号的字符串,但最终会错误地将其拆分为多列(。CSV模块使用值列表来表示单行。

import csv
def return_contents(file_name):
with open(file_name) as infile:
reader = csv.reader(infile)
return list(reader)
data1 = return_contents('csv1.csv')
data2 = return_contents('csv2.csv')
print(data1)
print(data2)
combined = []
for row in data1:
combined.extend(row)
for row in data2:
combined.extend(row)
with open('csv_out.csv', 'w', newline='') as outfile:
writer = csv.writer(outfile)
writer.writerow(combined)

该代码为您提供了该方法的基础,但将其扩展到数百个文件会很难看。相反,您可能希望os.listdir一个接一个地提取单个目录中的所有文件,并将它们添加到您的输出中。这就是我将读取代码打包到return_contents函数中的原因;我们可以在不同的文件上重复相同的过程数百万次,只需一组代码即可进行实际读取。类似这样的东西:

import csv
import os

def return_contents(file_name):
with open(file_name) as infile:
reader = csv.reader(infile)
return list(reader)
all_files = os.listdir('my_csvs')
combined_output = []
for file in all_files:
data = return_contents('my_csvs/{}'.format(file))
for row in data:
combined_output.extend(row)
with open('csv_out.csv', 'w', newline='') as outfile:
writer = csv.writer(outfile)
writer.writerow(combined_output)

如果您专门处理csv文件格式。我建议您使用csv包进行文件操作。如果您也使用with。。。as语句,您不需要担心关闭文件等。您只需要定义PATH,然后程序将迭代所有.csv文件以下是您可以做的:

PATH = "your folder path"
def order_list():
data_list = []
for filename in os.listdir(PATH):
if filename.endswith(".csv"):
with open("data.csv") as csvfile:
read_csv = csv.reader(csvfile, delimiter=',', quoting=csv.QUOTE_NONNUMERIC)
for row in read_csv:
data_list.extend(row)
print(data_list)
if __name__ == '__main__':
order_list()

将数据存储在pandas df 中

import pandas as pd    
df = pd.read_csv('file.csv')

将修改后的数据帧存储到新的中

df_2 = df.groupby('Column_Name').agg(lambda x: ' '.join(x)).reset_index() ## Write Name of your column

将df写入新的csv

df2.to_csv("file_modified.csv")

您也可以这样做:

fIn = open("test.csv", "r")
fOut = open("output.csv", "w")
fOut.write(",".join([line for line in fIn]).replace("n",""))
fIn.close()
fOut.close()

我有你现在想在多个文件上运行它,你可以用带参数的脚本运行它:

import sys
fIn = open(sys.argv[1], "r")
fOut = open(sys.argv[2], "w")
fOut.write(",".join([line for line in fIn]).replace("n",""))
fIn.close()
fOut.close()

因此,现在希望您使用一些Linux系统,脚本名为csvOnliner.py,您可以用来调用它

for i in *.csv; do python csvOnliner.py $i changed_$i; done

有了windows,你可以这样做:

FOR %i IN (*.csv) DO csvOnliner.py %i changed_%i

最新更新