首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:合并文本文件的行并跳过某些记录

Python:合并文本文件的行并跳过某些记录
EN

Stack Overflow用户
提问于 2022-10-19 19:48:28
回答 3查看 56关注 0票数 0

我有一个如下所示的输入文件(请注意文件中可能没有空行。)

11111*作者姓名

22222*日期

11111 01 Var-1

11111 02 Var-2

11111 02 Var-3

将使用的规则:

  • ,如果星号(*)出现在记录的第6位,那么跳过记录。
  • 前6字节是序列号,也可以是空格。然而,前六个字节--无论是空格还是数字--都可以忽略。
  • 只组合在位置#6不存在星号的记录。
  • 只考虑从输入文件中的位置7开始到第72位置的数据。
  • 添加逗号,如下所示:

预期产出01,Var-1,02,Var-2,02,Var-3

下面是我试图打印记录的代码。但是,我无法在每个文本之后得到逗号(,)。有些以空格作为前缀。有人能帮忙吗?

代码语言:javascript
复制
with open("D:/Desktop/Files/Myfile.txt","r") as file_in:
    for lines in file_in:
        if "*" not in lines:
            lines_new = " ".join(lines.split())
            lines_fin = lines_new.replace(' ',',')
            print(lines_fin,end=' ')
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-10-19 20:11:10

假设你只想一个接一个地打印它们(它们仍然是分开的)

代码语言:javascript
复制
with open("D:/Desktop/Files/Myfile.txt","r") as file_in:
    for line in file_in:
        if line == "\n": # skip empty lines
            continue 
        if line[5] == "*": #skip if asterix at 6th position
            continue
        line = line.strip() # remove trailing and starting whitespace
        line = line.replace(' ', ',') # replace remaining spaces with commas
        print(line, ',') 

如果你只想把它们全部结合起来,那么更好的方法是:

代码语言:javascript
复制
with open("D:/Desktop/Files/Myfile.txt","r") as f:
    all_lines = f.readlines()

all_lines = [line.strip().replace(" ",",") for line in all_lines if line != "\n" and line[5] != "*"]
all_lines = ",".join(all_lines)

我还没有测试过这个,所以可能有排字!

票数 2
EN

Stack Overflow用户

发布于 2022-10-20 07:10:08

我将使用Python的路径库,因为它具有一些处理路径和读取文本文件的有用功能。

要将项连接在一起,可以将想要加入的项放到Python中,然后在列表上使用join方法。

我还改变了您如何分割数据的逻辑。当一行被保留时,行总是被删除的前6个字符,这样这些字符就可以被分割掉。如果您首先这样做,它会使空白上的分隔更加清晰,因为您得到了您正在寻找的两个项目。

如果数据长度超过72个字符,似乎需要截断它,所以我将数据行限制为72个字符。

这就是我的测试代码的样子:

代码语言:javascript
复制
from pathlib import Path

data_file = Path("D:/Desktop/Files/Myfile.txt")
field_size = 72


def combine_file_contents(filename):
    combined_data = []
    for line in filename.read_text().splitlines():
        if line and line[5] != "*":
            combined_data.extend(line[6:field_size].split())
    return ','.join(combined_data)


if __name__ == '__main__':
    expected_output = "01,Var-1,02,Var-2,02,Var-3"
    output_data = combine_file_contents(data_file)
    print("New Output:     ", output_data)
    print("Expected Output:", expected_output)
    assert output_data == expected_output

当我使用问题中的测试数据运行时,这给出了以下输出:

代码语言:javascript
复制
New Output:      01,Var-1,02,Var-2,02,Var-3
Expected Output: 01,Var-1,02,Var-2,02,Var-3
票数 0
EN

Stack Overflow用户

发布于 2022-10-20 07:53:40

我认为regex解决方案很优雅

您需要处理数据长度为72的限制,但这不应该是一个问题。

代码语言:javascript
复制
import re

pattern = r'[\s\d]{6}(.+)'
out = []
with open('combinestrings.txt', 'r') as infile:
    for line in infile:
        result = re.findall(pattern, line)
        if result:
            out.append(','.join(result[0].split(' ')))
    print(','.join(out))

产出:

代码语言:javascript
复制
01,Var-1,02,Var-2,02,Var-3
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74131083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档