具有列名的文件数据绑定

时间:2018-12-27 22:43:27

标签: python python-3.x pandas data-binding file-handling

我有包含成百上千行数据的文件,但它们没有任何列。 我想去每个文件,使它们一行一行,然后将它们存储在列表中,然后再按列分配值。但是在这里,我很困惑,因为每一行的值都在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

我在这里想念什么?任何工具吗?

1 个答案:

答案 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)