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

时间:2018-12-07 13:07:23

标签: python python-3.x

我正在尝试将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()

能请你帮忙吗?

5 个答案:

答案 0 :(得分:6)

您应该为此使用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)

答案 1 :(得分:3)

如果您专门处理csv文件格式。我建议您使用csv软件包进行文件操作。如果您还使用with ... as语句,则不必担心关闭文件等问题。您只需要定义PATH,然后程序将迭代所有{{ 1}}个文件 您可以执行以下操作:

.csv

答案 2 :(得分:2)

将数据存储在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")

答案 3 :(得分:2)

您也可以这样:

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

答案 4 :(得分:-1)

遍历文件时需要替换换行符

INPUT_FILE_PATH = r'C:\Temp\csv_file.csv'
OUTPUT_FILE_PATH = r'C:\Temp\csv_file_modified.csv'

file_input = open(INPUT_FILE_PATH,'r')
file_output = open(OUTPUT_FILE_PATH,'w')

for row in file:
    file_output.write(row.replace('\n',','))

file_input.close()
file_output.close()

如果我要使用您的代码,就这样

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