Python;查找 ASCII 字符后,行号在脚本中不重复
Python; Line number not repeating in script after looking for ASCII character
TL;DR - 我需要一个行号计数来重复,但它不是。
我查看是否有任何内容可以回答我的具体问题,并且我得到了很多帮助并且几乎已经解决了这个问题,但只是想问一下返回给我的是什么。
我有一个包含人名列表的文件。它包含一个 Given Name、Surname 列,通过它我可以获得全名。我想做的是确定名称中是否包含非 ASCII 字符,是什么字符,以及文件中可以找到该名称的行号。
这是我的代码片段:
with open('testFile.txt', 'r') as myFile:
for l in lastName:
if 0 <= ord(l) <= 127:
pass
else:
for num, line in enumerate(myFile, start=1):
if lastName in line:
print('Line number:', num)
print('Unicode Character:', l, '\n')
for f in firstName:
if 0 <= ord(f) <= 127:
pass
else:
for num, line in enumerate(myFile, start=1):
if firstName in line:
print('Line number:', num)
print('Unicode Character:', f, '\n')
结果有效 'okay',但还不完整。例如,如果我的文件有三个名称:
- 海伦·杜塞
- 迈克·约翰逊
- 艾达·弗兰纳里
我的结果是这样的:
Line Number: 1
Unicode Character: é
Unicode Character: ç
Unicode Character: é
Line Number: 3
Unicode Character: ï
我的代码中是否有明显的东西可以准确地确定为什么我没有得到那个 ç 或第二个 é 字符的行号的重复?有没有更简单的写法?
这段代码更紧凑一些。
regex 的sub
方法安排将匹配其第一个参数的模式替换为其第二个参数的值,并将其替换为第三个参数的值。模式 [a-zA-Z ]
查找单个 ascii 字符或空白。因此 sub
将用空字符串替换非 ascii 字符或空格。
import re
with open ('will.txt') as will:
for n, line in enumerate(will):
remaining = re.sub(r'[a-zA-Z ]', '', line.rstrip())
if remaining:
print ('Line number:', n+1, 'non-ascii', remaining)
编辑:利用 KyrSt 的注释,正则表达式应包含一些其他字符,例如“'”和“-”。
编辑 2:在与 KyrSt 进行详尽讨论后,我得出的结论是他是对的,正则表达式应该是 [\x00-\x7F]
我认为有一种更简单的方法可以解决这个问题。包括名称的解析并为下面的变量 delimiter
设置适当的值,您想要的代码可能是这样的
line_number = 0
with open('testFile.txt', 'r') as myFile:
line = myFile.readline().replace('\n','')
while line != '':
line_number += 1
firstName, lastName = line.split(delimiter)
for l in firstName:
if ord(l) > 127 or ord(l) < 0:
print('Line number:', line_number)
print('Unicode Character:', l, '\n')
for l in lastName:
if ord(l) > 127 or ord(l) < 0:
print('Line number:', line_number)
print('Unicode Character:', l, '\n')
line = myFile.readline().replace('\n','')
TL;DR - 我需要一个行号计数来重复,但它不是。
我查看是否有任何内容可以回答我的具体问题,并且我得到了很多帮助并且几乎已经解决了这个问题,但只是想问一下返回给我的是什么。
我有一个包含人名列表的文件。它包含一个 Given Name、Surname 列,通过它我可以获得全名。我想做的是确定名称中是否包含非 ASCII 字符,是什么字符,以及文件中可以找到该名称的行号。
这是我的代码片段:
with open('testFile.txt', 'r') as myFile:
for l in lastName:
if 0 <= ord(l) <= 127:
pass
else:
for num, line in enumerate(myFile, start=1):
if lastName in line:
print('Line number:', num)
print('Unicode Character:', l, '\n')
for f in firstName:
if 0 <= ord(f) <= 127:
pass
else:
for num, line in enumerate(myFile, start=1):
if firstName in line:
print('Line number:', num)
print('Unicode Character:', f, '\n')
结果有效 'okay',但还不完整。例如,如果我的文件有三个名称:
- 海伦·杜塞
- 迈克·约翰逊
- 艾达·弗兰纳里
我的结果是这样的:
Line Number: 1
Unicode Character: é
Unicode Character: ç
Unicode Character: é
Line Number: 3
Unicode Character: ï
我的代码中是否有明显的东西可以准确地确定为什么我没有得到那个 ç 或第二个 é 字符的行号的重复?有没有更简单的写法?
这段代码更紧凑一些。
regex 的sub
方法安排将匹配其第一个参数的模式替换为其第二个参数的值,并将其替换为第三个参数的值。模式 [a-zA-Z ]
查找单个 ascii 字符或空白。因此 sub
将用空字符串替换非 ascii 字符或空格。
import re
with open ('will.txt') as will:
for n, line in enumerate(will):
remaining = re.sub(r'[a-zA-Z ]', '', line.rstrip())
if remaining:
print ('Line number:', n+1, 'non-ascii', remaining)
编辑:利用 KyrSt 的注释,正则表达式应包含一些其他字符,例如“'”和“-”。
编辑 2:在与 KyrSt 进行详尽讨论后,我得出的结论是他是对的,正则表达式应该是 [\x00-\x7F]
我认为有一种更简单的方法可以解决这个问题。包括名称的解析并为下面的变量 delimiter
设置适当的值,您想要的代码可能是这样的
line_number = 0
with open('testFile.txt', 'r') as myFile:
line = myFile.readline().replace('\n','')
while line != '':
line_number += 1
firstName, lastName = line.split(delimiter)
for l in firstName:
if ord(l) > 127 or ord(l) < 0:
print('Line number:', line_number)
print('Unicode Character:', l, '\n')
for l in lastName:
if ord(l) > 127 or ord(l) < 0:
print('Line number:', line_number)
print('Unicode Character:', l, '\n')
line = myFile.readline().replace('\n','')