2014-02-11 5 views
0

Я недавно начал изучать подачу python, поэтому я не так уж велико, к сожалению, поэтому мне нужна ваша помощь в этой базовой файловой программе, которую я пытаюсь создать.
В принципе, я вхожу имя, фамилию, возраст, оценка в этом формате:
например:Python Filing - нужна помощь (новичок)

John Smith 17 22 (the spaces are tabs) 
Tom  Jones 34 18 
Lewis Martins 23 20 

До сих пор я создал это, который работает, но получает только первый счет, но я необходимо получить все из них:

F = open('Program File','r') 

    score_string = '' 
    count = 0 

    while count < 3: 
     readit = F.read(1) 
     if readit == '\t': 
      count += 1 
    score_string += F.readline() 
    print(score_string) 
+0

Вы, наверное, хотите использовать модуль 'csv'. – geoffspear

+0

@Wooble не знаю, что такое модуль csv или как его использовать, поскольку я сказал, что я новичок в файлах ..: o – user2993584

+0

Вы можете найти документацию по адресу http://docs.python.org/2/library /csv.html – geoffspear

ответ

2

Это потому, что в вашей петле вы пропускаете только три вкладки в первой строке. Вам нужно продолжить чтение, чтобы прочитать все строки.

Но вы могли бы сделать это более вещий (и простой) способ:

with open('Program File', 'r') as f: # open file 
    for line in f: # get each line 
     row = line.split('\t') # split line into in list by tabs 
     print row[3] # print fourth value 
+0

Работает и намного меньше .. спасибо! Кстати, есть ли какая-то конкретная причина, почему вы использовали «с открытым (...) как f»? или это просто для его уменьшения? – user2993584

+0

@ user2993584 Да, есть определенная причина. «with» автоматически закрывает файл в конце блока и даже в случае исключения. См. Http://effbot.org/zone/python-with-statement.htm – Bunyk

0

Вы можете попробовать:

with open(filename, 'r') as f: 
    data = [l.strip().split('\t') for l in f] 

Это даст что-то вроде:

data == [["John", "Smith", "17", "22"], ...] 

Вы затем может обработать data, чтобы превратить последнее значение в целое число:

scores = [int(l[3]) for l in data] 
+0

Он не фиксировал количество записей. Цикл 'while' пропускает четвертый столбец. – geoffspear

+0

А, я вижу, спасибо за разъяснение – jonrsharpe

1

Вы читаете только одну строку. Используйте время цикла по линии в файле:

with open('Program File','r') as F: 
    for line in F: 
     name, surname, age, score=line.split('\t') 
     print(score) 
0

Вы можете использовать csv module и словарь:

import csv 

data={} 
with open('/tmp/test.tsv') as f: 
    reader=csv.reader(f, delimiter='\t') 
    for line in reader: 
     data[(line[1], line[0])]=line[2:] 

print(data) 
# {('Jones', 'Tom'): ['34', '18'], ('Smith', 'John'): ['17', '22'], ('Martins', 'Lewis'): ['23', '20']} 

Поскольку это словарь списков, чтобы получить доступ к возрасту Тома Джонса вы могли бы сделать data[('Jones', 'Tom')][0]

Или, если вы хотите именованные значения, так что вы можете получить доступ к данным, как это:

data[('Martins', 'Lewis')]['score'] 

вы могли бы использовать вложенную Dict из dicts:

data={} 
with open('/tmp/test.tsv') as f: 
    reader=csv.reader(f, delimiter='\t') 
    for line in reader: 
     data[(line[1], line[0])]={'age':line[2], 'score':line[3]} 

# data={('Martins', 'Lewis'): {'age': '23', 'score': '20'}, ('Smith', 'John'): {'age': '17', 'score': '22'}, ('Jones', 'Tom'): {'age': '34', 'score': '18'}} 
1

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

with open('Program File') as f: 
    for line in f: 
     first_name, surname, age, score = line.strip().split('\t') 
     print score 
Смежные вопросы