2016-05-09 69 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://計算器。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 
相關問題