说我有一个我正在操作的文本文件。像这样的东西(希望这不是太难以理解):
data_raw = open('my_data_file.dat').read()
matches = re.findall(my_regex, data_raw, re.MULTILINE)
for match in matches:
try:
parse(data_raw, from_=match.start(), to=match.end())
except Exception:
print("Error parsing data starting on line {}".format(what_do_i_put_here))
raise
请注意,在异常处理程序中有一个名为what_do_i_put_here
的变量。我的问题是:如何分配该名称,以便我的脚本将打印包含“坏区域”开头的行号。我试着和谁一起工作?我不介意重新阅读文件,我只是不知道我做了什么......
答案 0 :(得分:0)
我写了这个。它没有经过测试和效率低下,但确实有助于我的异常消息更加清晰:
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)
我甚至没有测试过列号是否模糊。我没有遵守YAGNI
答案 1 :(得分:0)
这里有一些更简洁的东西,在我看来比你自己的答案更容易理解:
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
才能为行尾字符提供正确的列数。
唯一的额外问题是空字符串的边缘情况,可以很容易地由保护子句处理。
我在 Python 3.8 中对其进行了测试,但在大约 3.4 版之后它可能可以正常工作(在某些较旧的版本中,len()
计算代码单元而不是代码点,我认为它会因任何包含以下字符的字符串而中断) BMP)