我做错了什么/我能做什么?
import sys
import string
def remove(file):
punctuation = string.punctuation
for ch in file:
if len(ch) > 1:
print('error - ch is larger than 1 --| {0} |--'.format(ch))
if ch in punctuation:
ch = ' '
return ch
else:
return ch
ref = (open("ref.txt","r"))
test_file = (open("test.txt", "r"))
dictionary = ref.read().split()
file = test_file.read().lower()
file = remove(file)
print(file)
这是在Python 3.1.2
中答案 0 :(得分:2)
在此代码中......:
for ch in file:
if len(ch) > 1:
奇怪命名的file
(除了打破不用自己的标识隐藏内置名称的最佳做法)不是文件,它是一个字符串 - 这意味着在Python 3中使用unicode,但这不是与循环返回单个字符(Python 3中的unicode字符,而不是字节)这一事实不同,因此len(ch) == 1
完全由Python语言规则保证。不确定你试图通过该测试完成什么(排除unicode字符的某些子集?),但是,无论是你实现了什么,我向你保证你不是实现它并且应该重新编写那部分。
除此之外,你将立即返回 - 并因此退出函数 - 从而退出函数并返回一个字符(文件中的第一个字符,如果第一个字符是标点符号则返回空格)字符)。
我在另一个答案中看到的使用translate
方法的建议是正确的,但该答案使用了错误版本的translate
(一个应用于字节字符串,不需要来解码你需要的Python 3)。正确的unicode版本更简单,并将函数的整个主体转换为两个语句:
trans = dict.fromkeys(map(ord, string.punctuation), ' ')
return file.translate(trans)
答案 1 :(得分:1)
在python中,字符串是不可变的,因此您需要使用您的更改创建一个新字符串。
有几种方法可以做到这一点:
一个是使用列表推导来检查字符,只返回非标点符号。
def remove(file):
return ''.join(ch for ch in file if ch not in string.punctuation)
您还可以调用函数来测试角色或翻译您可能抛出“奇怪角色”异常的角色或执行其他功能:
def remove(file):
return ''.join(TranslateCh(ch) for ch in file if CheckCh(ch))
另一个替代方案是string
模块,提供replace
或translate
。翻译为此提供了一个很好的(并且比构建列表更有效)机制,请参阅Alex的答案。
或者......你可以在for
循环上收集一个列表并在最后加入它,但这有点“unpythonic”。
答案 2 :(得分:0)
查看re(正则表达式)模块。它有一个“sub”函数来替换与正则表达式匹配的字符串。