将CSV列中的多行转换为单独的行

2024-09-28 19:05:55 发布

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

第一列是唯一的,只有一个条目。后面的列都有多个换行符,我想把每一行都放在自己的行中。你知道吗

还有大约50000行在这个文件中,将需要循环通过

我现在拥有的

Type, Animal, Age
Animals,Dog\nZebra\nPanda\nBear,40\n26\n18\n59

我的目标是什么

Type, Animal, Age
Animals,Dog,40
Animals,Zebra,26
Animals,Panda,18
Animals,Bear,59

老实说,我不知道从哪里开始,希望有人能把我引向正确的方向。希望能够完成它与某种权力地狱,但开放的任何东西。你知道吗


Tags: 文件目标agetype条目animalsdogzebra
3条回答
import itertools
raw = 'Animals,Dog\nZebra\nPanda\nBear,40\n26\n18\n59'
categories = raw.split(',')
result = zip(itertools.repeat(categories[0]),
             categories[1].split('\n'),
             categories[2].split('\n'))

print(result)  # >>> [('Animals', 'Dog', '40'), ('Animals', 'Zebra', '26'), ('Animals', 'Panda', '18'), ('Animals', 'Bear', '59')]

一些假设:

  • 格式是常量(类型、实体、年龄)。你知道吗
  • 我用python,因为你给它加了标签。你知道吗
  • 数据有效(我没有做任何验证测试)
  • 最后的输出是一个元组列表,每个元组包含动物记录。你知道吗

对文件中的每一行执行.split(','),然后遍历创建的列表,如下所示:

for i in list:
    i.split('\n')

现在你有一个列表,应该是这样的:

list_line1 = [Type, Animal, Age]
list_line2 = [Animals,[Dog,Zebra,Panda,Bear],[40,26,18,59]]

这样你就可以更容易地浏览列表。。。所以你只需投入其中,并以你喜欢的方式保存!你知道吗

for animal in list_line2[1]:
    save the way you like it here!

我希望这有帮助

由于原始csv不会在带换行符的字段周围加引号,因此文件需要用newline='\r\n'打开,这样只有\r\n被视为换行符,而\n本身不是:

import csv
from itertools import repeat

# assuming lines looks like
# Type, Animal, Age\r\n
# Animals,Dog\nZebra\nPanda\nBear,40\n26\n18\n59\r\n

# specifically set newlines to '\r\n'
with open('file.csv', 'r', newline='\r\n') as fin:
    with open('new_file.csv', 'w', newline='') as fout:
        writer = csv.writer(fout)
        for line in fin:
            # manually split row
            row = line.rstrip().split(',')
            for newrow in zip(repeat(row[0]), row[1].split('\n'), row[2].split('\n')):
                writer.writerow(newrow)

如果您的原始csv被正确引用,您的代码将如下所示:

import csv
from itertools import repeat

# assuming lines looks like
# Type, Animal, Age
# Animals,"Dog\nZebra\nPanda\nBear","40\n26\n18\n59"\r\n 

with open('file.csv', 'r', newline='') as fin:
    with open('new_file.csv', 'w', newline='') as fout:
        reader = csv.reader(fin, delimiter=',')
        writer = csv.writer(fout, delimiter=',')
        for row in reader:
            for newrow in zip(repeat(row[0]), 
                              row[1].split('\n'),
                              row[2].split('\n')):
                writer.writerow(newrow)

相关问题 更多 >