1

我试图弄清楚如何打开文件,将文件中的所有字母变成小写,然后取出所有标点符号。我已经尝试了一些我在网上和我的书中看到的东西,但我似乎无法弄清楚。

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
4

2 回答 2

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()将整个 string 小写F2,这正是您想要做的,所以无论如何它都可以解决。这意味着您可以将所有这三行替换为:

F3=F2.lower()

您还应该始终关闭您打开的文件。由于这可能很棘手(例如,在您的函数中,您必须记住在成功和错误的情况下都关闭它),最好的方法是自动使用with子句。替换这两行:

F = open(Filename)
F2=F.read()

和:

with open(Filename) as F:
    F2=F.read()

在那之后,除了使用非 PEP-8 样式,如果你有大文件会出现性能问题,你的代码真的没有问题。

于 2013-04-24T18:59:32.523 回答
0

关于这个话题有很多讨论,一个简单有效的方法是:

s="Then he said, \"I\'m so confused!\"." 
s.translate(string.maketrans("",""), string.punctuation)

类似的讨论可以在这里找到:

从 Unicode 格式的字符串中删除标点符号

Python正则表达式标点识别

从 Python 中的字符串中去除标点符号的最佳方法

于 2013-04-24T19:11:19.063 回答