文件操作:如何取出标点符号和大写字母?

时间:2013-04-24 18:51:22

标签: python string file python-3.x

我正在试图找出如何打开文件,将文件中的所有字母设为小写,然后取出所有标点符号。我尝试了一些我在网上和书中看过的东西,但我似乎无法弄明白。

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

2 个答案:

答案 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

Python Regex punctuation recognition

Best way to strip punctuation from a string in Python