我对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)
答案 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。