重写一个 csv 文件,通过重新排列列和行来完成

2024-06-10 14:37:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个csv文件输入.csv)看起来像这样:

ID; Text_1; Points_1; Text_2; Points_2
1; "Hello world one"; 33; "Hello world two"; 90
2, "Goodbye world one"; 44; "Goodbye world two";100

我想创建另一个csv文件(我们称之为输出.csv)这样重新排列列:

^{pr2}$

这似乎不像我所想的那样简单。我想知道有没有办法直接抄写文件。提前谢谢。在

我在一些帮助下尝试过这个方法,但是我很难按照我说的顺序读取和复制列和行。在

with open("results.csv", "r") as text:
    reader = csv.DictReader(text, delimiter=";")

rows = [l.split(";") for l in text.split("\n")]
del filas[0] 

newlist = list()
for l in filas:
  newlist.append([l[0], 'Texto_1', l[2]])
  newlist.append([l[0], 'Texto_2', l[4]])

Tags: 文件csvtextinhelloforworldone
3条回答

你可以试试这个:

def get_data()
   with open('filename.csv') as f:
      data = [i.strip('\n').split('; ') for i in f]
      header = data[0]
      for i, a in enumerate(data):
          yield [data[0], header[1], data[1], data[2]]
          yield [data[0], header[3], data[3], data[4]]

final_data = ['; '.join(i) for i in get_data()]

只需读取每一行并写出两行,并在相应的字段中:

import csv

with open('input.csv','r',newline='') as infile:
    with open('output.csv','w',newline='') as outfile:
        r = csv.reader(infile,delimiter=';')
        w = csv.writer(outfile,delimiter=';')
        next(r) # skip the original header
        w.writerow('ID Field Sent Points'.split())
        for id,t1,p1,t2,p2 in r:
            w.writerows([[id,'Text_1',t1,p1],
                         [id,'Text_2',t2,p2]])

输出:

^{pr2}$

注意:.csv模块不需要引号,除非字段包含分隔符。如果您需要的话,csv.writer还有其他的报价选项。在

下面的代码并不能提供您真正需要的内容,但我相信它将帮助您重新组织csv文件中的列。在

import csv

with open('input.csv', 'r') as infile, open('output.csv', 'w') as outfile:
    # output dict needs a list for new column ordering
    fieldnames = ['ID', 'Text_1', 'Text_2', 'Points_1', 'Points_2']
    writer = csv.DictWriter(outfile, fieldnames=fieldnames)
    # reorder the header first
    writer.writeheader()
    for row in csv.DictReader(infile):
        # writes the reordered rows to the new file
        writer.writerow(row)

对于以下输入:

^{pr2}$

上述程序将输出:

ID, Text_1, Text_2, Points_1, Points_2
1, "Hello world one", "Hello world two", 33, 90
2, "Goodbye world one", "Goodbye world two", 44, 100

相关问题 更多 >