我正在试图找出如何打开文件,将文件中的所有字母设为小写,然后取出所有标点符号。我尝试了一些我在网上和书中看过的东西,但我似乎无法弄明白。
import string
def ReadFile(Filename):
try:
F = open(Filename)
F2=F.read()
except IOError:
print("Can't open file:",Filename)
return []
F3=[]
for word in F2:
F3=F2.lower()
exclude = set(string.punctuation)
F3= ''.join(ch for ch in F3 if ch not in exclude)
return F3
Name = input ('Name of file? ')
Words = ReadFile(Name)
print (F3)
给出一个句子,如
Then he said, "I'm so confused!".
成为
then he said im so confused
答案 0 :(得分:2)
您的代码问题出在最后一行:
print (F3)
F3
是函数内局部变量的名称。你不能从这里访问它。
但是您可以访问该变量中的相同值,因为该函数返回了它,并将其存储在Words
中。
所以,就这样做:
print(Words)
现在,您的代码正常运作。
话虽如此,它可以得到改善。
最重要的是,请看这一部分:
F3=[]
for word in F2:
F3=F2.lower()
for word in F2:
实际上遍历F2
中的每个字符,因为这就是字符串的工作原理。如果你想逐字逐句,你需要做for word in F2.split():
同时,在循环内部,每次循环都重新分配F3
,并且永远不会对之前的值做任何事情,所以整个事情最终成为一种非常花哨(和缓慢)的方式来完成最后的任务。
幸运的是,最后一个赋值F3=F2.lower()
将整个字符串F2
缩小,这正是您想要做的,所以无论如何它都可以运行。这意味着您可以用以下内容替换所有这三行:
F3=F2.lower()
您还应该始终关闭您打开的文件。由于这可能很棘手(例如,在您的函数中,您必须记住在成功和错误情况下都要关闭它),使用with
子句自动执行此操作的最佳方法。替换这两行:
F = open(Filename)
F2=F.read()
使用:
with open(Filename) as F:
F2=F.read()
之后,除了使用非PEP-8样式以外,如果您有大量文件,性能问题,那么您的代码确实没有问题。
答案 1 :(得分:0)
关于这个主题有很多讨论,一个简单有效的方法是:
s="Then he said, \"I\'m so confused!\"."
s.translate(string.maketrans("",""), string.punctuation)
可以在这里找到类似的讨论:
Remove punctuation from Unicode formatted strings