【问题标题】:How to split file into smaller by first number in second column如何按第二列中的第一个数字将文件拆分为更小
【发布时间】:2016-06-14 00:42:40
【问题描述】:

所以我的数据看起来像:

1 3456542  5 may 2014
2 1245678  4 may 2014
3 4256876  2 may 2014
4 5643156  6 may 2014
.....    

目标是按第 2 列对其进行排序,然后根据第 2 列中的第一个数字分隔行(即 3456542 进入 subs_3.txt,1245678 进入 subs_1.txt...)。输出完全错误,给了我 6 个文件,其中似乎是随机行。有什么建议吗?

import csv
from operator import itemgetter

file_lines = []
with open("subs.txt", "r") as csv_file:
    reader = csv.reader(csv_file, delimiter=" ")
    for row in reader:
        file_lines.append(row)

file_lines.sort(key=itemgetter(1))

with open("sorted_subs.txt", "w") as csv_file:
    writer = csv.writer(csv_file, delimiter=" ")
    for row in file_lines:
        writer.writerow(row)

for row in file_lines:
    file_num = row[1[1]
    with open("file_{0}.txt".format(file_num), "w") as f:
        writer = csv.writer(f, delimiter=" ")
        writer.writerow(row)

【问题讨论】:

    标签: python text io


    【解决方案1】:

    您可以使用itertools.groupby 将进入同一文件的行组合在一起,然后循环遍历这些组以写入文件:

    from itertools import groupby
    
    for k, g in groupby(file_lines, key=lambda x: x[1][0]):
        with open("file_{0}.txt".format(k), "w") as f:
            csv.writer(f, delimiter=" ").writerows(g)
    

    更新:groupby 将根据第二列中的第一个数字对行进行分组。它将返回用于分组的键和包含分组项的迭代器。由于file_lines 已经排序,我们知道属于同一组的所有项目将在一个组内返回。这是一个简短的示例,它是如何工作的,请注意测试数据与原始问题中的不同,以便演示分组:

    from itertools import groupby
    
    lst = [
        ['2', '1245678', '', '4', 'may', '2014'], 
        ['1', '3456542', '', '5', 'may', '2014'], 
        ['3', '3256876', '', '2', 'may', '2014'], 
        ['4', '5643156', '', '6', 'may', '2014']
    ]
    
    for k, g in groupby(lst, key=lambda x: x[1][0]):
        print('key: {0}, items: {1}'.format(k, list(g)))
    

    输出:

    key: 1, items: [['2', '1245678', '', '4', 'may', '2014']]
    key: 3, items: [['1', '3456542', '', '5', 'may', '2014'], ['3', '3256876', '', '2', 'may', '2014']]
    key: 5, items: [['4', '5643156', '', '6', 'may', '2014']]
    

    【讨论】:

    • 我收到此错误消息。尝试用谷歌搜索,但在这种情况下不理解:TypeError Traceback(最近一次调用最后一次) in () 21 for k, g in groupby(file_lines, key=lambda x : x[1][0]): 22 with open("file_{0}.txt".format(k), "wb") as f: ---> 23 csv.writer(f, delimiter="" ).writerows(g) TypeError: a bytes-like object is required, not 'str
    • @e1v1s 那是由 Python 3 的文件模式下的b 引起的,我将模式改回w 所以现在它应该可以正常工作了。
    • 谢谢,你能帮我分解一下英文代码吗,尤其是第一行,我很新,还没有完全理解。
    • @e1v1s:添加了简短的解释,您也可以参考 Python 文档。
    • @ niemmi:所以如果我想按日期分开,我可以保持一切不变,除了:for k, g in groupby(file_lines, key=lambda x: x[3]):
    猜你喜欢
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 2022-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2021-06-25
    • 1970-01-01
    相关资源
    最近更新 更多