【问题标题】:Python concatenate multiple files up to certain limit of lines in each onePython连接多个文件,每个文件最多有一定的行数
【发布时间】:2019-06-08 02:13:20
【问题描述】:

我正在寻找一种能够连接不同 .txt 文件的代码,但每个文件的行数最多。

假设我们有很多文本文件如下:

file1.txt:

AAAAA

BBBBB

CCCCC

DDDDD

EEEEE

file2.txt:

FFFFF

GGGGG

HHHHH

IIIII

JJJJJ

file3.txt:

KKKKK

LLLLL

MMMMM

NNNNN

OOOOO

file4.txt:

PPPPP

QQQQQ

RRRRR

SSSSS

TTTTT

我们如何制作一个如下所示的日志文件(假设所有这些文件必须仅连接到包含第 3 行的行号)?

结果:

AAAAA

BBBBB

CCCCC

FFFFF

GGGGG

HHHHH

KKKKK

LLLLL

MMMMM

PPPPP

QQQQQ

RRRRR

这适用于 Python 3.7.3。我成功地使用以下示例连接文件:

Python concatenate text files

但我无法针对每个文件的特定最大行数修改代码。

到目前为止开发的相关代码(但未成功):

    a = open('newfile.log', 'wb')
    with a as wfd:
            for f in glob.glob(r'*.txt'):
                    with open(f,'rb') as fd:
                            for line in fd:
                                    for line in range (0, 3):
                                            a.write(line)  

有什么帮助吗?

得到的错误信息说:

TypeError: 需要一个类似字节的对象,而不是 'int'

【问题讨论】:

  • 您不想使用wfd.write() 而不是a.write() 吗?

标签: python


【解决方案1】:

你确定要使用

for **line** in fd:

  for **line** in range (0, 3):

第二行变量覆盖第一行,所以行是从 0..3 开始的整数 如果您确实想这样做,只需使用

a.write(str(line))

【讨论】:

    【解决方案2】:

    如果我理解正确,试试这个:

    import glob
    
    limit = 3
    with open('newfile.log', 'wb') as wfd:
        for f in glob.glob(r'*.txt'):
            with open(f, 'rb') as fd:
                line_count = 0
                for line in fd:
                    if line_count >= limit:
                        break
                    wfd.write(line)
                    line_count += 1
    

    【讨论】:

    【解决方案3】:

    第一个循环中line 的值是bytes,因为f 是以二进制模式打开的,它被第二个循环覆盖并变成int,这不是write() 所期望的。 你可以用writelines()写一个你可以用readlines()得到的行列表,当然你可以在readlines()上使用切片来只得到前3行:

    import glob
    
    with open("newfile.log", "wb") as log:
        for f in glob.glob("*.txt"):
            with open(f, "rb") as fd:
                log.writelines(fd.readlines()[:3])
    

    【讨论】:

      【解决方案4】:

      如果您可以通过调用range() 来描述您想要的行号,那么您可以使用itertools.islice 以获得更直接的方法:

      from itertools import islice
      
      max_lines = 3
      
      with open('newfile.log', 'wb') as wfd:
          for f in glob.glob(r'*.txt'):
              with open(f, 'rb') as fd:
                  wfd.writelines(islice(fd, max_lines))
      

      【讨论】:

        猜你喜欢
        • 2021-07-06
        • 2016-08-18
        • 2019-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多