Python:获取字符串索引的行号和列号?
假设我有一个正在操作的文本文件。类似这样的内容(希望这不是太难理解):Python:获取字符串索引的行号和列号?,python,file,text,Python,File,Text,假设我有一个正在操作的文本文件。类似这样的内容(希望这不是太难理解): 请注意,在异常处理程序中有一个名为what\u do\u i\u put\u的特定变量。我的问题是:如何分配该名称,以便我的脚本将打印包含我尝试使用的“坏区域”开头的行号?我不介意重读这个文件,我只是不知道该怎么办…我写了这个。它未经测试且效率低下,但它确实帮助我的异常消息更加清晰: def coords_of_str_index(string, index): """Get (line_number, col) o
请注意,在异常处理程序中有一个名为
what\u do\u i\u put\u的特定变量
。我的问题是:如何分配该名称,以便我的脚本将打印包含我尝试使用的“坏区域”开头的行号?我不介意重读这个文件,我只是不知道该怎么办…我写了这个。它未经测试且效率低下,但它确实帮助我的异常消息更加清晰:
def coords_of_str_index(string, index):
"""Get (line_number, col) of `index` in `string`."""
lines = string.splitlines(True)
curr_pos = 0
for linenum, line in enumerate(lines):
if curr_pos + len(line) > index:
return linenum + 1, index-curr_pos
curr_pos += len(line)
我甚至没有测试列号是否准确。我没有遵守雅格尼的规定,这里有一点更清楚,我认为比你自己的答案更容易理解:
def index_to_coordinates(s, index):
"""Returns (line_number, col) of `index` in `s`."""
if not len(s):
return 1, 1
sp = s[:index+1].splitlines(keepends=True)
return len(sp), len(sp[-1])
它的工作原理与您自己的答案基本相同,但通过使用字符串切片splitlines()
实际上可以计算您需要的所有信息,而无需任何后期处理
必须使用keepends=True
为行尾字符提供正确的列计数
唯一的额外问题是空字符串的边缘情况,它可以很容易地由一个guard子句处理
我在Python3.8中对它进行了测试,但在大约3.4版之后,它可能会正常工作(在一些较旧的版本中,
len()
计算代码单元而不是代码点,并且我假设对于任何包含BMP以外字符的字符串,它都会中断)正则表达式是否使用新行?如果没有,您可以逐行查找,然后很容易获得行号。是的,它会占用多行(这就是为什么我使用了re.MULTILINE
)re.findall不会返回字符串列表吗?:。字符串没有start或end方法。否,它返回一个列表MatchObject
实例,请参阅:我建议使用s
以避免隐藏标准库string
模块。
def index_to_coordinates(s, index):
"""Returns (line_number, col) of `index` in `s`."""
if not len(s):
return 1, 1
sp = s[:index+1].splitlines(keepends=True)
return len(sp), len(sp[-1])