IndexError: string index out of range:

此生再无相见时 提交于 2021-02-13 17:32:27

问题


I'm trying take a .txt file populated by 88 rows, each of which has two characters separated by a space, copy the first character in each row into a list #1, copy the second character of each list into a list #2 and then populate a dictionary with those two lists. Something, however, is going wrong when I try to copy down the data from the file into my lists. Could you tell me what I'm not doing correctly?

I keep getting this error: "IndexError: string index out of range" at the line where I have typed "column1[count] = readit[0]"

def main():

    modo = open('codes.txt', 'r')       #opening file
    filezise = 0                        #init'ing counter
    for line in modo:
        filezise+=1                     #counting lines in the file
    column1 = []*filezise
    column2 = []*filezise               #making the lists as large as the file
    count = 0                           #init'ing next counter
    while count < filezise+1:
        readit = str(modo.readline())
        column1[count] = readit[0]      ##looping through the file and
        column2[count] = readit[2]      ##populating the first list with the
        count+=1                        #first character and the second list       
    print(column1, column2)             #with the second character     
    index = 0                               
    n = 0
    codebook = {}                       #init'ing dictionary
    for index, n in enumerate(column1): #looping through to bind the key
        codebook[n] = column2[index]    #to its concordant value
    print(codebook)
main()

回答1:


When you write

 for line in modo:
        filezise+=1  

You have already consumed the file. If you want to consume it again, you need to do modo.seek(0) first to rewind the file back.

If you do not rewind the file, the line below will return an empty string, because there is nothing left in the file.

readit = str(modo.readline())

Of course, there's no real need to go through the file twice. You can just do it once and append to your lists.

column1 = []
column2 = []
for line in modo:
   filezise+=1
   column1.append(line[0])
   column2.append(line[2])



回答2:


Try this

codebook =  dict([''.join(line.strip().split(' ')) for line in open('codes.txt').readlines()])



回答3:


You are getting the error because column1 = []*filezise doesn't actually make a list of length filezise. (If you look at the result, you will see that column1 is just an empty list.) When you try to access column1[count] when count > 0, you will get that error because there is nothing in column1 with an index greater than 0.

You shouldn't be trying to initialize the list. Instead, iterate over the lines in the file and append the appropriate characters:

column1=[]
column2=[]
for line in file('codes.txt'):
    column1.append(line[0])
    column2.append(line[2])



回答4:


There's a much simpler way to get a dictionary from your file, by using the csv module and the dict() built-in function:

import csv

with open('codes.txt', 'rb') as csvfile:
    codebook = dict(csv.reader(csvfile, delimiter=' '))



回答5:


So long as the intermediate lists aren't being used, you could also use a dictionary comprehension to do everything in one go.

with open('codes.txt', 'r') as f:
    codebook = {line[0]: line[-1] for line in f.read().splitlines()}


来源:https://stackoverflow.com/questions/23098258/indexerror-string-index-out-of-range

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!