2016-04-15 11 views
0

я делаю судоку в питона и у меня есть небольшая проблема, чтобы знать, как я должен получить данные из файлаИзвлечение данных из .txt

так у меня есть файл с тем, кто выглядит следующим образом:

.3. ... ... 
..8 39. 6.. 
5.1 2.. 49. 
.7. 6.. ... 
2.. ... .4. 
... 5.3 98. 
... ... 15. 
... ..7 ..9 
4.. .1. 3.. 

каждые девять очков это «\ п»

Как я могу получить эти данные?

На данный момент, я только что сделал, что:

import os 

f = open('sudo.txt', 'r') 
lines = f.read() 
f.close() 

sudoku = lines 

print(sudoku) 
os.system("pause") 

Спасибо за вашу помощь.

+1

Решение судоку программным и чтение файла в Python являются два совершенно разных понятия. Я редактирую любой запрос на решение судоку (который должен быть отдельным вопросом, и, безусловно, будет слишком широким, как написано, что больше похоже на «сделайте мою домашнюю работу») –

ответ

0

Конструкции цикла Python могут в основном перебирать что угодно, включая строки, поэтому для чего-то подобного вам нужно разделить строку на символах новой строки, чтобы отделить строки, а затем перебрать эти строки и поместить их в массив, если они не являются одним из пространств, разделяющих поля. Предположим, что вам нужна плата в массиве 2d, это понимание списка будет делать то, что вы просите.

sudoku = [[character for character in line if not character==" "] for line in lines.split("\n")] 
+0

большое вам спасибо! быстрый и лаконичный. Просто маленький вопрос, что такое x и y точно? – Ravaniss

+0

y - каждая строка, потому что она перебирает массив, возвращенный из lines.split ("\ n"), а x - каждый символ в строке y. Я редактировал сообщение, чтобы иметь более описательные имена переменных. – Natecat

0

readlines будет разделять данные по линиям. Кроме того, при открытии файлов всегда используйте инструкцию with.

with open('sudo.txt') as f: 
    lines = f.readlines() 

Затем можно разобрать его дальше с расколом:

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', '.', '.']]] 
+0

Это не отвечает на вопрос, он спрашивает, как получить данные в формате, который можно использовать для выполнения алгоритмов. – Natecat

+0

Вы правы, но это, казалось, отвечало первому препятствию, которое они достигли. Я обновил. –

2

Это на самом деле гораздо сложнее вопроса, чем другие ответы, похоже, рассматривают. Особенно Решение sudoku (что выходит за рамки данного вопроса)

Рассмотрите, какую структуру данных вы хотите. Я предположил бы, что вы хотели бы перепрофилировать в 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 - это немного глоток. Давайте пройдем через это.

Основной синтаксис команды comp. Ничего не надо говорить здесь

[ [ 0 if el == '.' else int(el) for el in line if el.strip() ] ... ] 

Это глоток, но это в основном просто список НЕСТЕДОВ.Это один говорит

[ 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. 
+0

Если я ошибаюсь, 'if el' ничего не делает, вы никогда не столкнетесь с пустой строкой при итерации по строке. – Natecat

+0

@Natecat кричит, что ты прав. Я пытался выбрать пробелы, но я пропустил вызов «.strip». ('' ".strip()' является ложным) –

Смежные вопросы