我有包含成百上千行数据的文件,但它们没有任何列。
我想去每个文件,使它们一行一行,然后将它们存储在列表中,然后再按列分配值。但是在这里,我很困惑,因为每一行的值都在60左右,并且有些额外的列已分配了值,因此应该在每一行中添加它们。
代码如此:
import re
import glob
filenames = glob.glob("/home/ashfaque/Desktop/filetocsvsample/inputfiles/*.txt")
columns = []
with open("/home/ashfaque/Downloads/coulmn names.txt",encoding = "ISO-8859-1") as f:
file_data = f.read()
lines = file_data.splitlines()
for l in lines:
columns.append(l.rstrip())
total = {}
for name in filenames:
modified_data = []
with open(name,encoding = "ISO-8859-1") as f:
file_data = f.read()
lines = file_data.splitlines()
for l in lines:
if len(l) >= 1:
modified_data.append(re.split(': |,',l))
rows = []
i = len(modified_data)
x = 0
while i > 60:
r = lines[x:x+59]
x = x + 60
i = i - 60
rows.append(r)
z = len(modified_data)
while z >= 60:
z = z - 60
if z > 1:
last_columns = modified_data[-z:]
x = []
for l in last_columns:
if len(l) > 1:
del l[0]
x.append(l)
elif len(l) == 1:
x.append(l)
for row in rows:
for vl in x:
row.append(vl)
for r in rows:
for i in range(0,len(r)):
if len(r) >= 60:
total.setdefault(columns[i],[]).append(r[i])
在其他脚本中,我已经将具有60个值的两行分开,并且应与行一起添加的最后5至15列是分开的,但是我仍然困惑于如何绑定所有数据。 绑定后,数据应如下所示。 outputdata.xlsx 数据输入文件: inputdata.txt
我在这里想念什么?任何工具吗?
答案 0 :(得分:0)
我相信您可以通过将输入文件转换为CSV文件来解决您的问题,然后将其导入所需的任何程序中。
我编写了一个小型生成器,该生成器一次读取一个文件,然后在一定数量的行之后返回一行,在本例中为60。在该生成器中,您可以根据需要对数据进行任何修改。
然后将每个生成的行直接写入到csv中。这样可以使此过程的内存需求保持较低水平。
我不了解您对正则表达式拆分所做的工作,但是将其添加到生成器中足够简单。
import csv
OUTPUT_FILE = "/home/ashfaque/Desktop/File handling/outputfile.csv"
INPUT_FILE = "/home/ashfaque/Desktop/File handling/inputfile.txt"
# This is a generator that will pull only num number of items into
# memory at a time, before it yields the row.
def get_rows(path, num):
row = []
with open(path, "r", encoding="ISO-8859-1") as f:
for n, l in enumerate(f):
# apply whatever transformations that you need to here.
row.append(l.rstrip())
if (n + 1) % num == 0:
# if rows need padding then do it here.
yield row
row = []
with open(OUTPUT_FILE, "w") as output:
csv_writer = csv.writer(output)
for r in get_rows(INPUT_FILE, 60):
csv_writer.writerow(r)