如何遍历 PYTHON 中的文件中的单词?
How can I travel through the words of a file in PYTHON?
我有一个 .txt 文件,我想浏览其中的文字。我有一个问题,我需要在遍历单词之前删除标点符号。我试过了,但它没有删除标点符号。
file=open(file_name,"r")
for word in file.read().strip(",;.:- '").split():
print word
file.close()
您当前方法的问题在于 .strip()
并没有真正按照您的意愿行事。它会删除前导字符和尾随字符(并且您想删除文本中的字符),如果您想指定除空格之外的字符,它们需要在列表中。
另一个问题是您的列表不会过滤掉更多潜在的标点符号字符(问号、感叹号、unicode 省略号、破折号)。相反,您可以使用 string.punctuation
来获取范围广泛的字符(请注意 string.punctuation
不包括一些非英语字符,因此它的可行性可能取决于您输入的来源):
import string
punctuation = set(string.punctuation)
text = ''.join(char for char in text if char not in punctuation)
一种更快的方法(如 other 所示)使用 string.translate()
替换字符:
import string
text = text.translate(string.maketrans('', ''), string.punctuation)
在将单词存储在列表中后,我会使用 replace
函数删除标点符号,如下所示:
with open(file_name,"r") as f_r:
words = []
for row in f_r:
words.append(row.split())
punctuation = [',', ';', '.', ':', '-']
words = [x.replace(y, '') for y in punctuation for x in words]
您可以尝试使用 re
模块:
import re
with open(file_name) as f:
for word in re.split('\W+', f.read()):
print word
有关详细信息,请参阅 re documentation。
编辑:如果是非 ASCII 字符,前面的代码会忽略它们。在这种情况下,以下代码可以提供帮助:
import re
with open(file_name) as f:
for word in re.compile('\W+', re.unicode).split(f.read().decode('utf8')):
print word
strip()
仅删除字符串开头或结尾处的字符。
所以split()
先切词,然后strip()
去掉标点符号。
import string
with open(file_name, "rt") as finput:
for line in finput:
for word in line.split():
print word.strip(string.punctuation)
或者使用像 nltk
这样的自然语言感知库:http://www.nltk.org/
以下代码保留撇号和空格,如果需要,可以轻松修改以保留双引号。它通过使用基于字符串对象子类的翻译 table 来工作。我认为代码相当容易理解。如有必要,它可能会变得更有效率。
class SpecialTable(str):
def __getitem__(self, chr):
if chr==32 or chr==39 or 48<=chr<=57 \
or 65<=chr<=90 or 97<=chr<=122:
return chr
else:
return None
specialTable = SpecialTable()
with open('temp2.txt') as inputText:
for line in inputText:
print (line)
convertedLine=line.translate(specialTable)
print (convertedLine)
print (convertedLine.split(' '))
这是典型的输出。
This! is _a_ single (i.e. 1) English sentence that won't cause any trouble, right?
This is a single ie 1 English sentence that won't cause any trouble right
['This', 'is', 'a', 'single', 'ie', '1', 'English', 'sentence', 'that', "won't", 'cause', 'any', 'trouble', 'right']
'nother one.
'nother one
["'nother", 'one']
我有一个 .txt 文件,我想浏览其中的文字。我有一个问题,我需要在遍历单词之前删除标点符号。我试过了,但它没有删除标点符号。
file=open(file_name,"r")
for word in file.read().strip(",;.:- '").split():
print word
file.close()
您当前方法的问题在于 .strip()
并没有真正按照您的意愿行事。它会删除前导字符和尾随字符(并且您想删除文本中的字符),如果您想指定除空格之外的字符,它们需要在列表中。
另一个问题是您的列表不会过滤掉更多潜在的标点符号字符(问号、感叹号、unicode 省略号、破折号)。相反,您可以使用 string.punctuation
来获取范围广泛的字符(请注意 string.punctuation
不包括一些非英语字符,因此它的可行性可能取决于您输入的来源):
import string
punctuation = set(string.punctuation)
text = ''.join(char for char in text if char not in punctuation)
一种更快的方法(如 other string.translate()
替换字符:
import string
text = text.translate(string.maketrans('', ''), string.punctuation)
在将单词存储在列表中后,我会使用 replace
函数删除标点符号,如下所示:
with open(file_name,"r") as f_r:
words = []
for row in f_r:
words.append(row.split())
punctuation = [',', ';', '.', ':', '-']
words = [x.replace(y, '') for y in punctuation for x in words]
您可以尝试使用 re
模块:
import re
with open(file_name) as f:
for word in re.split('\W+', f.read()):
print word
有关详细信息,请参阅 re documentation。
编辑:如果是非 ASCII 字符,前面的代码会忽略它们。在这种情况下,以下代码可以提供帮助:
import re
with open(file_name) as f:
for word in re.compile('\W+', re.unicode).split(f.read().decode('utf8')):
print word
strip()
仅删除字符串开头或结尾处的字符。
所以split()
先切词,然后strip()
去掉标点符号。
import string
with open(file_name, "rt") as finput:
for line in finput:
for word in line.split():
print word.strip(string.punctuation)
或者使用像 nltk
这样的自然语言感知库:http://www.nltk.org/
以下代码保留撇号和空格,如果需要,可以轻松修改以保留双引号。它通过使用基于字符串对象子类的翻译 table 来工作。我认为代码相当容易理解。如有必要,它可能会变得更有效率。
class SpecialTable(str):
def __getitem__(self, chr):
if chr==32 or chr==39 or 48<=chr<=57 \
or 65<=chr<=90 or 97<=chr<=122:
return chr
else:
return None
specialTable = SpecialTable()
with open('temp2.txt') as inputText:
for line in inputText:
print (line)
convertedLine=line.translate(specialTable)
print (convertedLine)
print (convertedLine.split(' '))
这是典型的输出。
This! is _a_ single (i.e. 1) English sentence that won't cause any trouble, right?
This is a single ie 1 English sentence that won't cause any trouble right
['This', 'is', 'a', 'single', 'ie', '1', 'English', 'sentence', 'that', "won't", 'cause', 'any', 'trouble', 'right']
'nother one.
'nother one
["'nother", 'one']