Python过滤非字母数字不能正常工作

时间:2017-12-12 22:14:33

标签: python file filter alphanumeric

我有一个包含随机字母,数字和字符的文本文件。我必须删除特殊字符,最后只打印字母数字字符,同时打印过程。

文本文件是这样的:

fkdjks97#!%&jd
28e8uw99...

等等

出于某种原因打印:

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

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

读行&#39; ,, S.8,ymsw5w-86&#39;

&#39; ,, S.8,ymsw5w-86&#39; - &GT; &#39; s8ymsw5w86&#39;

我的尝试:

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

2 个答案:

答案 0 :(得分:3)

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

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

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

请注意,您不应该在while True次呼叫时使用file1.readline()循环。您可以直接在文件上使用for循环来获取行,方法是将while Trueline = file1.readline()if len(line) == 0: break行替换为:

for line in file1:
    # ...

答案 1 :(得分:0)

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

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)