使用Python将文本文件转置为csv

时间:2014-11-10 23:54:51

标签: python csv transpose

我对Python完全陌生。 我有一个非常庞大的文本文件。我想做两件事。 1.从中提取某个区域,这是我能够做到的。 2.现在转置提取的区域并写入csv文件。事实证明这有点棘手。拉链功能没有做我想要的。这是来自步骤1的print语句的数据。我想转置这些数据。

Number  "A1"    "A2"    "A3"    "A4"

Data    "ABCD"  "ABCD"  "ABCD"  "ABCD"

Date    "Jan 04,2013"   "Jan 04,2013"   "Jan 04,2013"   "Jan 04,2013"

每一行之间都有一条空行。我需要转置此数据并保存到csv文件(不将日期拆分为两个单独的列)。我有很多这样的文件,每个标题都有变化。所以大熊猫也不起作用。

import csv
import pandas as pd
colnames= ['Number','Data','Date']
fw=open("output.csv", "w")
f= open('input.txt', "rb")
fi = csv.writer(fw, delimiter=',',quoting=csv.QUOTE_ALL)
l = f.read()
ll= [x.split(',') for x in l.split('||')]
cols1 = ll[0]
cols2 = ll[1]
cols3 = ll[2]

final_cols = [cols1, cols2, cols3]
s= zip(*final_cols)
df = pd.DataFrame(s)
df.to_csv(fw, index=False, header=False)

4 个答案:

答案 0 :(得分:2)

使用您的数据并重新删除日期中的空格,以便拆分将日期保持在一起:

import re
with open("in.txt") as f:
    lines = [re.sub('\s(?=\d\d,)',",",x).split() for x in f if x.strip()]
    print(zip(*lines))
[('Number', 'Data', 'Date'), ('A1', 'ABCD', 'Jan,04,2013'), ('A2', 'ABCD', 'Jan,04,2013'), ('A3', 'ABCD', 'Jan,04,2013'), ('A4', 'ABCD', 'Jan,04,2013')]

写作是微不足道的:

import re
import csv
with open("in.txt") as f:
    lines = [re.sub('\s(?=\d\d,)',",",x).split() for x in f if x.strip()]
    zipped = zip(*lines)
    with open("out.csv","w") as f1:
        wr = csv.writer(f1)
        wr.writerows(zipped)

答案 1 :(得分:1)

你仍然可以使用熊猫。

import pandas as pd
data = pd.read_csv("input.txt", delim_whitespace=True , header = None, index_col = 0)
data = data.dropna()
data = data.transpose()
data.to_csv("output.csv", index = False)

在上面的代码中,data.dropna()允许删除空行,data.transpose()允许你转置数据帧。

输出如下:

Number,Data,Date
A1,ABCD,"Jan 04,2013"
A2,ABCD,"Jan 04,2013"
A3,ABCD,"Jan 04,2013"
A4,ABCD,"Jan 04,2013"

答案 2 :(得分:0)

您遇到了一些问题,首先尝试将文件拆分为' ||'和那些不是你的分隔符的'"'您可以逐行构建表,然后转置+写入csv文件。

(编辑)我没有考虑引号内的空格。更新以兑现引号并使用';'作为分隔符,因为您的日期包括逗号。我使用正则表达式来查找引号中没有空格或单词的单词,然后删除引号。

import csv
import re

find_cells_re = re.compile(r'\w+|"[^"]*"')

with open('input.txt', "r") as f:
    # extract rows, filtering out empty lines
    table = [row for row in 
        (cell.strip('"') for cell in 
        (find_cells_re.findall(line) for line in f))
        if row]
with open("output.csv", "w") as fw:
    writer = csv.writer(rw)
    for row in zip(*table):
        writer.writerow(row)

答案 3 :(得分:0)

delimiter=','设置为更改为CSV。