我有一个数据文件,前8行看起来像这样。 (取代实际后 为了这个问题的清晰度,用字母表示值)
a,b,c
d
e,f
g,h
i,j,k
l
m,n
o,p
这些代表有关电网中变压器的数据。前4 线是关于变压器1的信息,接下来的四个是变压器2 等等。
变量a-p可以是整数,浮点数或字符串
我需要在python中编写一个脚本,以便将一个变换器的数据分散到4行,而不是将它们全部放在一行上。
更准确地说,我希望将上述两行转换为
a,b,c,d,e,f,g,h
i,j,k,l,m,n,o,p
并将其写入另一个数据文件 我该怎么做?
答案 0 :(得分:1)
如果总是4行(这行中的字段数不重要)是关于一件事的信息你可以这样做:
with open('your_data_file.txt', 'r') as i, open('output_file.txt', 'w') as o:
new_info = 4
for line in i:
o.write(line.strip()) # use .strip() to remove new line character
new_info -= 1
if new_info == 0:
o.write('\n') # begin info of new transformer in new line
new_info = 4
else:
o.write(',') # write a , to separate the data fields, but not at
# the end of a line
在此代码中,输入和输出文件将被打开,并且输出的一行中的输入总是4行“转换”并写入。
答案 1 :(得分:1)
使用grouper recipe from itertools
from itertools import izip_longest
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
with open('z.t') as f:
d = grouper(f, 4)
for x in d:
print ','.join(y.rstrip() for y in x)
a,b,c,d,e,f,g,h
i,j,k,l,m,n,o,p
答案 2 :(得分:0)
假设此数据模式在整个输入文件中仍然存在......
首先,您需要读取包含数据的文件(filename
是一个字符串;文件的路径)
f = open(filename, "r") # open in read mode
content = f.read() # read everything as one string
f.close()
一旦你以字符串(content
)的形式阅读了文件的内容,只需收集所有数据,然后将其分开然后重新形成即可。
假设每个变压器与8个值相关联;
content = content.replace('\n', ',') # put everything on one line
values = content.split(',') # split it all up
lines = []
for i in range(0, len(values), 8): # iterate by 8 elements
lines.append(",".join(values[i:i+8])) # merge these values and add to lines
output = "\n".join(lines) # merge these lines (via new lines)
然后,您将继续将输出写入文件;
f = open(newfile, "w") # open the new file in write mode; it doesn't have to exist yet
f.write(output)
f.close()
答案 3 :(得分:0)
这个怎么样:
import itertools
# From itertools recipes
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return itertools.izip_longest(fillvalue=fillvalue, *args)
with open('output', 'w+') as fout:
with open('filename') as fin:
fout.writelines(','.join(tup) + '\n' for tup in
grouper(itertools.chain.from_iterable(
line.strip().split(',') for line in fin), 8, '-'))
这将所有行中的所有字段链接在一起作为单个可迭代,然后将它们分组为8个块,然后将它们写入新文件。
这个方法并不关心每行有多少列 - 它甚至可以在整个文件中改变。它只需要它们作为连续的8元组