Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:获取字符串索引的行号和列号?_Python_File_Text - Fatal编程技术网

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])