遇到字符串和数组问题

时间:2017-04-13 06:29:37

标签: python arrays string

我想阅读文本文件并复制介于' ~~~~~~~~~~~~~~'之间的文字。成阵列。但是,我是Python的新手,这就是我所拥有的:

with open("textfile.txt", "r",encoding='utf8') as f:
    searchlines = f.readlines()

a=[0]
b=0
for i,line in enumerate(searchlines):
    if '~~~~~~~~~~~~~' in line:
        b=b+1
    if '~~~~~~~~~~~~~' not in line:
        if 's1mb4d' in line:
            break
        a.insert(b,line)

这是我设想的: 首先,我阅读了文本文件的所有行, 然后我宣布' a'作为应添加文本的数组, 然后我宣布' b'因为我需要它作为索引。 ' ~~~~~~~~~~~~~'之间的行数。是不是,这就是为什么我使用' b'所以我可以把文字行放到一个数组索引中,直到一个新的' ~~~~~~~~~~~~~'被发现了。

我查看' ~~~~~~~~~~~~~'如果发现我增加' b'所以我可以开始在新的数组索引中添加文本行。 文本文件以' s1mb4d'结束,因此一旦找到,程序就结束了。 如果' ~~~~~~~~~~~~~'在行中找不到,我在文本中添加了文本。

但事情并不顺利。这些' ~~~~~~~~~~~~~'之间的整个文本只有1行。正被复制到每个数组索引。

以下是文本文件的示例:

~~~~~~~~~~~~~

Text123asdasd asdasdjfjfjf

~~~~~~~~~~~~~

123ABC 321bca gjjgfkk

~~~~~~~~~~~~~

5 个答案:

答案 0 :(得分:1)

您可以使用正则表达式,试一试:

import re

input_text = ['Text123asdasd asdasdjfjfjf','~~~~~~~~~~~~~','123abc 321bca gjjgfkk','~~~~~~~~~~~~~']

a = []
for line in input_text:
    my_text = re.findall(r'[^\~]+', line)
    if len(my_text) != 0:
        a.append(my_text)

它的作用是逐行查找所有字符但是'〜'如果行只包含'〜'它会忽略它,之后带有文本的每一行都会附加到你的列表中。

只是因为我们可以,oneliner(不包括import和source ofc):

import re

lines = ['Text123asdasd asdasdjfjfjf','~~~~~~~~~~~~~','123abc 321bca gjjgfkk','~~~~~~~~~~~~~']
a = [re.findall(r'[^\~]+', line) for line in lines if len(re.findall(r'[^\~]+', line)) != 0]

答案 1 :(得分:0)

在python中,解决大部分问题的方法通常是从执行该工作的标准库中找到正确的函数。在这里,您应该尝试使用split,这应该更容易。

如果我理解你的目标,你可以这样做:

joined_lines = ''.join(searchlines)
result = joined_lines.split('~~~~~~~~~~')

第一行将你的行列表连接成一个sinle字符串,然后第二行将每次遇到' ~~'序列

答案 2 :(得分:0)

我尽我所知尽力清理它,尝试一下,让我知道它是否有效。我们可以共同努力!:)

with open("textfile.txt", "r",encoding='utf8') as f:
    searchlines = f.readlines()

a = []
currentline = ''

for i,line in enumerate(searchlines):
    currentline += line
    if '~~~~~~~~~~~~~' in line:
        a.append(currentline)
    elif 's1mb4d' in line:
        break

一些注意事项:

  • 您可以使用elif作为休息功能
  • Append会自动将下一次迭代添加到数组的末尾
  • currentline将继续在每一行添加文本,只要它没有's1mb4d'或~~~我认为是你想要的

答案 3 :(得分:0)

s = ['']
with open('path\\to\\sample.txt') as f:
   for l in f:
      a = l.strip().split("\n")
      s += a

a = []
for line in s:
    my_text = re.findall(r'[^\~]+', line)
    if len(my_text) != 0:
        a.append(my_text)
print a
>>> [['Text123asdasd asdasdjfjfjf'], ['123abc 321bca gjjgfkk']]

答案 4 :(得分:0)

如果你愿意强制/接受约束,那么分隔符应该是13个字符(实际上'\ n%s \ n'%('〜'* 13)是具体)... 然后你可以使用

为相对正常大小的文件完成此操作
#!/usr/bin/python
## (Should be #!/usr/bin/env python; but StackOverflow's syntax highlighter?)
separator = '\n%s\n' % ('~' * 13)
with open('somefile.txt') as f:
    results = f.read().split(separator)

# Use your results, a list of the strings separated by these separators.

请注意,'〜'* 13是一种在Python中通过重复一些较小的字符串十三次来构造字符串的方法。 'xx%sxx'%'YY'是一种将一个字符串“插入”另一个字符串的方法。当然你可以将十三个字符粘贴到你的源代码中...但我会考虑构造如图所示的字符串,以明确长度是字符串规范的一部分 - 这是你的文件格式的一部分要求......以及任何其他数量的〜字符是不够的。

如果你真的想要任意数量〜字符的任何行作为分隔符而不是你想要使用正则表达式模块中的 .split()方法而不是 .split()方法由内置字符串对象提供。

请注意,此代码段将返回分隔线之间的所有文本,包括它们包含的任何换行符。还有其他代码片段可以过滤掉这些代码片段。例如,鉴于我们之前的结果:

# ... refine results by filtering out newlines (replacing them with spaces)
results = [' '.join(each.split('\n')) for each in results]

(您也可以使用 .replace()字符串方法;但我更喜欢连接/拆分组合。在这种情况下,我们使用列表理解(Python的一个特性)迭代结果中的每个项目,我们任意命名每个),执行我们的转换它,结果列表正在回到名称​​ results ;如果你要学习Python,我强烈建议学习并熟悉列表理解。它们是常用的,与许多其他编程和脚本语言的语法相比可能有点异国情调。)

这应该适用于MS Windows以及Unix(和类Unix)系统,因为Python处理“通用换行符”。要在Python 3下使用这些示例,您可能需要对编码和字符串类型进行一些处理。 (我不需要使用Homebrew在MacOS X下安装我的Python3.6 ......但只需要预先警告。)