Python将多个文件串联起来,每个文件中的行数限制为一定

时间:2019-06-02 20:08:31

标签: python

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

假设我们有许多文本文件,如下所示:

file1.txt:

        <ItemsControl.ItemContainerStyle>
            <Style TargetType="ContentPresenter">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsVisible}" Value="False">
                        <Setter Property="Visibility" Value="Collapsed" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ItemsControl.ItemContainerStyle>

file2.txt:

AAAAA

BBBBB

CCCCC

DDDDD

EEEEE

file3.txt:

FFFFF

GGGGG

HHHHH

IIIII

JJJJJ

file4.txt:

KKKKK

LLLLL

MMMMM

NNNNN

OOOOO

我们如何制作一个如下所示的日志文件(假设所有日志文件最多只能串联到包括在内的行号3)?

结果:

PPPPP

QQQQQ

RRRRR

SSSSS

TTTTT

这是针对Python 3.7.3的。我使用以下示例提供了成功的连接文件:

file

但是我无法为每个文件指定最大行数来修改代码。

迄今已开发了相关代码(但未成功完成):

AAAAA

BBBBB

CCCCC

FFFFF

GGGGG

HHHHH

KKKKK

LLLLL

MMMMM

PPPPP

QQQQQ

RRRRR

有帮助吗?

获得的错误消息显示:

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

4 个答案:

答案 0 :(得分:0)

确定要使用

for **line** in fd:

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

第二个行变量将覆盖第一个,因此line是从0..3开始的整数 如果您确实想这样做,请使用

a.write(str(line))

答案 1 :(得分:0)

如果我对您的理解正确,请尝试以下操作:

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

答案 2 :(得分:0)

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

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])

答案 3 :(得分:0)

如果可以通过调用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))