我在python中做一个数独游戏,我有一点问题就是知道我应该如何从文件中获取数据
所以我有一个看起来像这样的文件:
.3. ... ...
..8 39. 6..
5.1 2.. 49.
.7. 6.. ...
2.. ... .4.
... 5.3 98.
... ... 15.
... ..7 ..9
4.. .1. 3..
每9个点就是" \ n"
我如何获取数据?
目前,我刚刚那样做了:
import os
f = open('sudo.txt', 'r')
lines = f.read()
f.close()
sudoku = lines
print(sudoku)
os.system("pause")
感谢您的帮助。
答案 0 :(得分:2)
这实际上比其他答案似乎要考虑的要困难得多。特别是解决数独(这不在本问题的范围内)
考虑您想要的数据结构类型。我想你想要在自定义类
中重新定位list
class Puzzle(list):
pass
然后传递一个从左到右从上到下的每个数字的列表,可能使用零(0
)作为空格,这意味着你的构造函数应该是
Puzzle([0,3,0,0,0,0,0,0,0,0,0,8,3,9,0,6,0,0, ... ])
您如何从目标数据中读取此信息?嗯,一次一个点。
with open("filename.txt") as inf:
puzzle = [
[0 if el == '.' else int(el) for el in line if el.strip()]
for line in inf]
那个列表comp虽然有点拗口。我们来看看吧。
puzzle = [ ... ]
基本列表comp语法。这里没什么可说的
[ [ 0 if el == '.' else int(el) for el in line if el.strip() ] ... ]
这是满口的,但它基本上只是一个NESTED列表组合。这个说
[ 0 if el == '.'
# if the character is a period (.), use a zero (0)
else int(el)
# otherwise, cast the character to integer since it's a number
for el in line
# we're iterating over each character in the string line
if el.strip()
# and selecting every "truthy" character (e.g. skipping the spaces)
其余部分很简单
[ ... for line in inf]
# "line" is each literal line in the file.
答案 1 :(得分:0)
sudoku = [[character for character in line if not character==" "] for line in lines.split("\n")]
答案 2 :(得分:0)
readlines将在行上拆分数据。此外,打开文件时始终使用with语句。
with open('sudo.txt') as f:
lines = f.readlines()
然后您可以使用split进一步解析它:
soduku = [[list(group) for group in line.split()] for line in lines]
哪会将您的数据放在这种格式中:
[[['.', '3', '.'], ['.', '.', '.'], ['.', '.', '.']],
[['.', '.', '8'], ['3', '9', '.'], ['6', '.', '.']],
[['5', '.', '1'], ['2', '.', '.'], ['4', '9', '.']],
[['.', '7', '.'], ['6', '.', '.'], ['.', '.', '.']],
[['2', '.', '.'], ['.', '.', '.'], ['.', '4', '.']],
[['.', '.', '.'], ['5', '.', '3'], ['9', '8', '.']],
[['.', '.', '.'], ['.', '.', '.'], ['1', '5', '.']],
[['.', '.', '.'], ['.', '.', '7'], ['.', '.', '9']],
[['4', '.', '.'], ['.', '1', '.'], ['3', '.', '.']]]