【问题标题】:remove some newline but not all in Python在 Python 中删除一些换行符,但不是全部
【发布时间】:2019-08-22 12:21:07
【问题描述】:

我有这种格式的数据

Picture
'#Type'
'10', '10'
000000000000000
110000110110000
Picture2
'#Type2'
'10', '10'
000000000000000
110000111110000

我可以使用

读取文件
sourcefile.read().splitlines() 

但是第 4 行和第 5 行将是列表中的两个项目。例如,列表将是

[picture],[#type],[10,10],[000000000000000],[110000110110000],...

但我的目标是连接 [000000000000000][110000110110000],即第 4 行和第 5 行,并使其成为一项。最终结果将类似于

[Picture],
['#Type'],
['10', '10'],
[000000000000000110000110110000]

我怎样才能做到这一点?更好的是,我怎样才能将它们 4 作为嵌套列表中的一个组?非常感谢。

【问题讨论】:

  • 换句话说,除非换行符在两个数字之间,否则您要在换行符上拆分规则吗?
  • 不是任何两个数字,只有 '10'、'10' 之后的数字

标签: python list foreach newline


【解决方案1】:

您可以尝试以下方法吗:

with open('data.txt', 'r') as infile:
    data = infile.read()
split_data = data.split('\n')
req_list = range(3, len(split_data), 5)
flag = False
for ind, val in enumerate(split_data):
    if flag:
        print([split_data[ind-1] + val])
        flag = False
        continue
    if ind not in req_list:
        print([val])
    else:
        flag = True

输出:

['Picture']
["'#Type'"]
["'10', '10'"]
['000000000000000110000110110000']
['Picture2']
["'#Type2'"]
["'10', '10'"]
['000000000000000110000111110000']

【讨论】:

  • 谢谢。你能解释一下这个逻辑吗?
  • 在每五行之后你得到二进制数,所以一个range函数id用来创建一个包含所需行号的列表。每当找到行号时,就会引发一个标志,并使用引发的标志附加二进制数字
  • 对于 for 循环中的第一次迭代,标志将设置为 true 对吗?但是在第二次迭代中会发生什么? split_data[ind-1] + val 如何连接两个二进制数?
  • 第一次迭代的时候flag没有设置为true,只有行号为4的时候flag才设置为true,为了更好的理解就打印出来,这样你就可以更好的理解了
【解决方案2】:

一旦完成,您就可以重新遍历数组。

arr = sourcefile.read().splitlines() 

获得数组后,您可以提取长度超过 9 个字符的输入

arrOfLargeNumbers = filter(lambda x: len(x) > 9, arr)

然后从数组中删除旧的并添加新的

arr.remove(arrOfLargeNumbers[0])
arr.remove(arrOfLargeNumbers[1])
arr.append(f'{arrOfLargeNumbers[0]}{arrOfLargeNumbers[1]}'

【讨论】:

    【解决方案3】:

    如果您总是每张图片有 4 行,那么您可以像现在一样拆分行 - 然后合并每第 3 行和第 4 行以获得结果

    【讨论】:

      【解决方案4】:
      with open("path_to_your_input_file", "r") as f:
      lines = [line.rstrip() for line in f.readlines()]
      new_lines = []
      last_was_digit = 0
      for i, line in enumerate(lines):
          if line.isdigit() and last_was_digit == 0:
              new_lines.append(["".join([line, lines[i+1]])])
              last_was_digit = 1
          elif last_was_digit == 1:
              last_was_digit = 0
          else:
              new_lines.append([line])
      

      所以这段代码通过从文件中读取来完成这项工作。它并不优雅,但很有效。

      输出:

      > [['Picture'], ["'#Type'"], ["'10', '10'"], ['000000000000000110000110110000']
      > ['Picture2'], ["'#Type2'"],["'10', '10'"], ['00000000000000011000011111000']]
      

      【讨论】:

        猜你喜欢
        • 2021-10-06
        • 2019-02-05
        • 1970-01-01
        • 1970-01-01
        • 2021-12-26
        • 1970-01-01
        • 2015-05-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多