【问题标题】:Python filtering non alphanumeric not working properlyPython过滤非字母数字无法正常工作
【发布时间】:2017-12-12 22:14:33
【问题描述】:

我有一个包含随机字母、数字和字符的文本文件。在打印过程时,我必须删除特殊字符并且只以字母数字结尾。

文本文件是这样的:

fkdjks97#!%&jd
28e8uw99...

等等

由于某种原因,它正在打印:

Line read' ,,s.8,ymsw5w-86    
 '
' ,,s.8,ymsw5w-86
 '->' <filter object at 0x0000020406BC8550> '

这些应该只有 2 行,而不是 4 行。像这样:

行读取' ,,s.8,ymsw5w-86'

' ,,s.8,ymsw5w-86' -> 's8ymsw5w86'

我的尝试:

file1 = open(textfile1,"r")

while True:
    line = file1.readline()
    line2 = filter(str.isalnum,line)
    print("Line read'", str(line), "'")
    print("'", str(line), "'->'", line2, "'")

    if len(line) == 0:
        break

【问题讨论】:

  • 在 Python 3 中,filter 是一个需要具体化为序列对象的对象,例如 liststr,例如 list(filter(...''.join(filter(...

标签: python file filter alphanumeric


【解决方案1】:

filter() 是一个迭代器对象;您需要实际迭代它以提取结果。

在这种情况下,您需要一个字符串,因此您可以使用str.join() 进行迭代并将所有内容放回单个字符串中:

line2 = ''.join(filter(str.isalnum, line))

请注意,您实际上并不需要在 file1.readline() 调用中使用 while True 循环。您可以直接在文件上使用for 循环来获取行,方法是将while Trueline = file1.readline()if len(line) == 0: break 行替换为:

for line in file1:
    # ...

【讨论】:

  • filter() 返回一个迭代器对象 ... true 仅适用于 Python 3
  • @quant: 并且 OP 使用的是 Python 3,这就是为什么他们看到 ` 输出。
  • @quant:OP提供的代码肯定是给Python 3的。
  • @quant:但正如 Martijn 解释的那样,&lt;filter object 仅在 Python 3 中。在 Python 2 中,它只是一个列表,在这种情况下,OP 不会看到 @987654333 @ 首先。对于使用 Python 2 的 OP,需要有一个 filter 阴影(例如在使用某些 2/3 兼容性库时完成,但这是认为斑马而不是马。)
  • @quant:此处的特定错误模式显示它是 Python 3。filter() 在 Python 中会产生一个字符串列表,每个字符串都是一个单独的字符。
【解决方案2】:

您可能正在寻找正则表达式解决方案:

import re
rx = re.compile(r'[^A-Za-z]+')

# some sample line
line = 'fkdjks97#!%&jd'

# and then later on
line = rx.sub('', line)
print(line)

产量

# fkdjksjd


将其放入 with... 构造中,您可能正在使用
with open(textfile1, "r") as fp:
    line = rx.sub('', fp.readline())
    print(line)

【讨论】:

    猜你喜欢
    • 2017-06-24
    • 2014-05-14
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 2017-05-15
    • 2019-11-12
    • 2011-07-13
    相关资源
    最近更新 更多