2015-02-12 21 views
0

两个不同的分隔符我有一个​​像下面这样的文本文件:格式化文本文件CSV包括在Python

A+B,item_1,item_2 
C+D,item_3,item_4 
E+F+G,item_5,item_6,item_7 

我试图使用Python将它重新格式化为类似下面的特定顺序csv文件:

B,item_1 
A,item_2 
D,item_3 
C,item_4 
G,item_5 
F,item_6 
E,item_7 

我该如何在Python中做到这一点?

编辑:

我已经尝试了许多不同的东西,下面是一个例子:

from sys import argv 
import re 

script, input_file = argv 

with open(input_file) as x: 
    text = x.read() 
    split_text = re.split('\+|\n|,', text) 

def split_list(y) 
    half_text = len(y)/2 
    return y[:half], y[half:] 

def(split_text) 

我试图分裂列表不同的方法,然后写出来,以一个输出文件。但由于列表大小的变化,我甚至没有接近我想要的。所以我之前没有发布我的试用码,因为我甚至不知道我应该如何处理它。谢谢阅读!

+0

“我尝试使用Python” - 你是怎么试? – Marcin 2015-02-12 02:19:11

+0

为了澄清,请显示您已经编写的代码。 – merlin2011 2015-02-12 02:20:32

回答

1

这里做了一个相当简洁的方式:的output_file事后

import csv 
import sys 

input_file, output_file = sys.argv[1:3] 

with open(input_file, 'rb') as inp_f, open(output_file, 'wb') as out_f: 
    csv_writer = csv.writer(out_f) 
    for row in csv.reader(inp_f): 
     try: 
      csv_writer.writerows(
       item for item in zip(reversed(row[0].split('+')), row[1:])) 
     except IndexError: 
      print 'bad row encountered', row 
      raise 

内容:

B,item_1 
A,item_2 
D,item_3 
C,item_4 
G,item_5 
F,item_6 
E,item_7 
+0

这真的很好!然而,当我将这个应用于我的其他文本文件更大,它通过我这个错误,我不知道为什么会发生这种情况:csv_writer.writerows(项目在zip中的项目(反向(行[0] .split(' +')),row [1:])) IndexError:列表索引超出范围 – 2015-02-12 06:45:57

+1

听起来就像您的其他文件中存在与该模式不匹配的行。我添加了一个异常处理程序,它会在遇到问题时打印出违规行。不知道你想在这种情况下做什么。 – martineau 2015-02-12 07:55:06

+1

如果你想忽略坏行,你可以删除我添加的'except'子句中的'raise'。如果你甚至不想打印警告消息,用'pass'替换它(你必须在子句中留下一些东西)。 – martineau 2015-02-12 15:24:57

2

这将是接近它的一种方法:

lines = ["A+B,item_1,item_2","C+D,item_3,item_4"] 
f = open("test.txt","w+") 

def new_line(line): 
    prt = line.strip().split(',') 
    f.write(str(prt[0].split('+')[0]) + ',' + str(prt[1]) + '\n') 
    f.write(str(prt[0].split('+')[1]) + ',' + str(prt[2]) + '\n') 

map(new_line,lines) 
f.close() 
1

假设你的数据在一个名为input.csv和字段数相匹配的头数

#!/usr/bin/python2.7 

import csv 

file_name='input.csv' 

with open(file_name,'rb') as csvfile: 
    my_reader = csv.reader(csvfile,delimiter=',') 
    for row in my_reader: 
    row_length=len(row) 
    if row_length: 
    columns = row[0].split('+') 
    num_columns = len(columns) 
    for i in range(num_columns): 
     print "%s,%s" % (columns[i],row[i+1]) 
+0

谢谢!我刚刚编辑了我的问题,因为字段的数量实际上有所不同。 – 2015-02-12 02:53:54

+0

即使有10个字段,它仍然可以工作,假设列标题的数量与值的数量匹配。如果他们少,这只是一个添加一个if语句的问题,以确保你比row_length更少 – 2015-02-12 02:57:56

2

你应该使用csv模块来照顾任何转义。 然后,它可被pythonically实现为

import csv, sys 

writer = csv.writer(sys.stdout) 

for row in csv.reader(sys.stdin): 
    writer.writerows(zip(reversed(row[0].split('+')), row[1:])) 

工程用更新的例子。