Python 使用row和col在txt.NET文件中查找字母
我已经创建了一个包含不同句子的txt.file,字母的位置之间没有联系,我希望将其保存为Python中的字典,然后使用row和col确定该文件中的任何特定字母 在代码中,我想让Python问两个问题来确定一个特定的字母:Python 使用row和col在txt.NET文件中查找字母,python,Python,我已经创建了一个包含不同句子的txt.file,字母的位置之间没有联系,我希望将其保存为Python中的字典,然后使用row和col确定该文件中的任何特定字母 在代码中,我想让Python问两个问题来确定一个特定的字母: 询问要查找的文件 询问两个坐标(行和列编号) 以下是我到目前为止得到的信息: def save_rows(filename): with open(filename, 'r') as f: answer = {} f
def save_rows(filename):
with open(filename, 'r') as f:
answer = {}
for line in f:
line = line.split()
if not line: # empty line?
continue
answer[line[0]] = line[1:]
def main():
filename = input("Input the file:")
indexed_file = save_rows(filename)
row = input("Input row-and column number:")
如何从这一点出发?一个简单的方法是:
def get_char_at(文件名、行、列):
行=int(行)
col=int(col)
打开(文件名)为f时:
lines=f.read().splitlines()
如果行>=len(行):
raise KeyError(f“文件{filename}不包含{row}行”)
如果列>=len(行[行]):
raise KeyError(f“行{row}不包含{col}字符”)
返回行[行][列]
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
filename=input('输入文件名:')
行=输入('输入行:')
列=输入('输入列:')
打印(在(文件名、行、列)处获取字符)
f.read().splitlines()
很方便,因为它会自动删除每行末尾的换行符。这里需要注意的主要问题是列表(如行
)和字符串(如行
中的每个项目)都是可索引的<代码>行[行]获取所需的行,而行[行][col]
获取该行中的字符。Python中的索引是从零开始的,所以正如所写的那样,提供0
和0
将获得文件中的第一个字符。如果你愿意的话,你可以根据需要从1开始减去1
注意:这是一种简单的方法,但不一定是最简单的方法。主要的缺陷是,这会立即将整个文件读入内存。对于大小合理的文本文件,这通常很好。如果您需要处理非常大的文件,那么迭代它的行比一次读取所有行更有效。但是这样你就不能直接索引到你需要的行。因此,get\u char\u at
可能看起来像:
def get_char_at(文件名、行、列):
行=int(行)
col=int(col)
打开(文件名)为f时:
对于索引,枚举(f)中的行:
如果索引==行:
如果col>=len(行)-1:#减去以说明换行
raise KeyError(f“行{row}不包含{col}字符”)
返回线[列]
raise KeyError(f“文件{filename}不包含{row}行”)
您可以循环浏览文件的行<代码>枚举提供当前所在行的索引。如果得到了正确的行,则返回字符(假设它有足够的字符)。另一方面,如果您在没有到达指定行的情况下浏览了整个文件,那么它显然没有那么多行。您可以尝试使用:
导入行缓存
def main():
filename=input(“输入文件:”)
行数,列数=[int(x)表示输入中的x(“输入行和列数:”).split()]
line=linecache.getline(文件名,行数)
linecache.clearcache()
如果不是line.strip()和col_num>0和col_num
打开文件并获取所需的行linecache.getline()
用于修改之前读取的行(例如,通过编辑文件)并希望读取(并缓存)修改后的行linecache.clearcache()
仅跳过带空格的行(有关详细信息,包括如何检查空行,请参阅)not line.strip()
- 假设用户使用
指定第一列,则需要使用1
col_num-1
dict
中保存不只有空格的行,可以将save_rows()
简化为:
def保存行(文件名):
打开(文件名)为f时:
返回{i:line for i,如果line.strip(),则返回枚举(f)中的行]
这样,您将拥有一个dict
,带有键
行号和值
行
编辑(基于评论中的提问):要实现关于允许输入的一些逻辑,您可以尝试:
导入系统
尽管如此:
用户输入=输入(“输入行和列编号:”)
如果用户输入=退出:
sys.exit()
尝试:
line_num,col_num=[user_input.split()中x的int(x)]
除值错误外:
打印('输入无效。请重试')
其他:
打破
打印(行数、列数)
上面的部分将等待用户输入有效的输入。在这种情况下,这正好是两个数字。如果用户未提供有效输入,将打印一条消息,并再次提示用户提供两个数字。如果用户输入的数字少于或多于两个,则会引发
ValueError
。如果用户不输入数字,也会发生同样的情况。最后,用户输入exit
程序exit
s。如果您不想让用户有多个机会输入有效的输入(但只有一个),您可以删除,而将dict
从文件的行中删除是不必要的复杂操作,至少对于这个特定问题是这样的。在代码中其他地方要做的事情是否需要这种结构?嗨,不,我不需要这种结构,但我需要学习如何做。然而,现在我更感兴趣的是如何找到哪个字母在两个坐标上。你似乎在你的行中循环,但没有停在指定的行上。Col看起来不错,但请记住,用户可以提供Colu