2016-05-09 4 views
0

Я хотел читать в файле, который имеет 4 значения по каждой строке: название, автор, жанр, цена.Разделить каждое слово в строке запятой, а затем сохранить всю строку в списке

Я хочу разделить каждое значение, которое имеет «,» как разделитель. Затем я хочу сохранить его в моем списке каждую строку, являющуюся записью в списке. Например

title, author, genre, price 

title2, author2, genre2, price2 

Это позволит сэкономить в

List[0][1] = title 
List[0][2] = author 
List[0][3] = genre 
List[0][4] = price 

List[1][1] = title2 
List[1][2] = author2 
List[1][3] = genre2 
List[1][4] = price2 

Это то, что я до сих пор:

def readFile(fileName): 
List = [] 
f = open(fileName, 'r') 
line = f.readline() 
x = 0 
while len(line) != 0: 
    for i in range(4): 
     List[x][i] = line.split(',') 
    x += 1 
    line = f.readline() 
f.close() 
return List 

Но я просто получаю List index out of range.

+1

Возможный дубликат [Python прочитать строку из файла и разделить его в значение] (HTTP: // StackOverflow.com/questions/9857731/python-read-in-string-from-file-and-split-it-into-values) – AKS

ответ

2

Python есть вы охвачены здесь, просто использовать csv module:

import csv 

def readFile(filename): 
    with open(filename, 'rb') as f: 
     reader = csv.reader(f) 
     return list(reader) 

Ваш код делает несколько классических ошибок:

  • str.split() возвращает список; вы пытаетесь присвоить этот список 4 раза индексам другого списка. Просто используйте список, возвращенный str.split() напрямую.
  • Учтите, что строки из файла поставляются с разделителем строк (\n); вы, вероятно, захотите снять это с первого раза.
  • Вы начали использовать пусто. Вы не можете назначать индексы, которых там нет, вместо этого добавьте list.append().
  • Вам не нужно тестировать len(line) != 0; просто if line: достаточно, потому что пустые строки считаются «ложными» в тесте правды. См. Truth Value Testing.
  • Вы не должны использовать file.readline() каждый раз; просто используйте цикл for line in f:, и вы получите каждую строку по одному, потому что файловые объекты: итеративный.
  • Если вы используете свой file as a context manager (с помощью инструкции with), Python закроет файл для вас.

Таким образом, без csv модуля, вы могли бы написать такой код:

def readFile(fileName): 
    rows = [] 
    with open(fileName, 'r') as f: 
     for line in f: 
      columns = line.strip().split(',') 
      rows.append(columns) 
    return rows 
+0

Извините, мне не разрешено использовать модули - я должен был указать это. Это для классной работы. – Ryan

+0

@ Ryan: Я уже писал все, что нужно было исправлять в вашем коде. –

+0

Спасибо. Это намного чище и эффективнее, чем то, что я делал. Объяснения действительно помогли! – Ryan

-1
with open(filname,'r') as f: 
     lst_data = f.readlines() 

    List = [] 
    for data in lst_data: 
     List.append(data.strip().split(',')) 

Список будет иметь данные, как этот

List[0][1] = title 
List[0][2] = author 
List[0][3] = genre 
List[0][4] = price 

List[1][1] = title2 
List[1][2] = author2 
List[1][3] = genre2 
List[1][4] = price2 
0

Я думаю, что вы можете использовать Python List Comprehensions, чтобы достичь вашей функции с меньшим количеством кода.

def readFile(fileName): 
    with open(fileName, 'r') as f: 
     List = [line.strip().split(',') for line in f if line.strip()] 
    return List 

Программа выше эквивалентна следующая программа:

def readFile2(fileName): 
    with open(fileName, 'r') as f: 
     List = [] 
     for line in f: 
      if line.strip(): 
       List.append(line.strip().split(',')) 
    return List 
Смежные вопросы