Python:从文本文件中获取数据并将其放入CSV文件中;列表索引超出范围

时间:2017-07-27 12:42:09

标签: python csv

这是对此的跟进问题:Python: Find keywords in a text file from another text file

我想将line.strip中的文本数据放入2列的CSV(或excel)文件中。

这是我的尝试:

import numpy as np
import pandas as pd
import csv

with open('C:\invoice.txt') as f:
    invoice_data = [line.strip() for line in f if line.strip()]

with open('C:\dict.txt') as f:
    dict_data = set([line.strip() for line in f if line.strip()])

for i in range(0, len(invoice_data), 2):
    if invoice_data[i] in dict_data:
        print(invoice_data[i: i + 2])

with open('C:\\Users\\fam_robo1\\Documents\\sample.csv','w') as csvfile:
    fieldnames = ['keyword','data']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    for i in range(0, len(invoice_data), 2):
        writer.writerow ({'keyword':[invoice_data[i]] , 'data':[invoice_data[i+2]] })
    csvfile.close()

任何帮助都将不胜感激。

完整追溯:

Traceback (most recent call last):   
 File "C:\Users\fam_robo1\Documents\keyword.py", line 20, in <module> writer.writerow ({'keyword':[invoice_data[i]] , 'data':[invoice_data[i+2]] }) 
 IndexError: list index out of range

2 个答案:

答案 0 :(得分:1)

线索在“列表索引超出范围”消息中。在编写行时,您同时引用了invoice_data[i]invoice_data[i+2](虽然我不确定为什么要将它们放在列表中,因为尝试将列表写为CSV元素也可能会造成麻烦)。

您的for语句可以i一直到len(invoice_data)-1,并且显然在该值下,索引i+2超出了允许的索引范围 - 因此您可以获得追溯

您在评论中询问为什么人们会继续低估您的问题。我怀疑这是因为他们没有真正的努力来理解错误究竟是什么。在您之前提到的问题中,您说“我继续获取索引错误。我是否需要先将其存储在表中?”但是你没有解释为什么你认为这会有所帮助,或者甚至是它应该意味着什么。

我怀疑你可能在你走路之前试图跑步,虽然尝试困难的问题表明了一些精神,但在努力招募SO的帮助之前你会很好地看看你得到的输出 - Python产生的信息大多数都有意义,如果你不理解它们,那么也许你应该首先尝试确定它们的含义。 “这个错误信息意味着什么”通常是一个可以接受的问题,如果你真的无法理解它。

正如您所了解的那样,您无疑将能够更好地确定您的计划出现了什么问题,但依赖其他人不会像您自己理解的那样尽快理解您的理解。

答案 1 :(得分:0)

特别感谢holdenweb帮助我相信自己。

所以我通过非常简单的重新排序解决了这个问题,但只是在首先学习了基本的python概念之后。

因此,如果像我这样的初学者正在阅读这篇文章,那么请遵循holdenweb分享的智慧,即使你认为自己能够实现它,也要先了解基本概念。

writer = pd.ExcelWriter('pandas_simple.xlsx')

with open('C:\\Users\\fam_robo1\\Documents\\sample.csv','w') as csvfile:
    fieldnames = ['keyword','data']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()

    for i in range(0, len(invoice_data), 2):
        if invoice_data[i] in dict_data:
            list1 = [invoice_data[i]];
            list2 = [invoice_data[i+1]];
            print(invoice_data[i: i + 2])
            writer.writerow ({'keyword':[list1] , 'data':[list2] })

    csvfile.close()

使用pandas的另一种方式:

for i in range(0, len(invoice_data), 2):
    if invoice_data[i] in dict_data:
        list1 = [invoice_data[i]];
        list2 = [invoice_data[i+1]];
        print(invoice_data[i: i + 2])
        df = pd.DataFrame({ 'keyword':list1 , 'information':list2})
        # Convert the dataframe to an XlsxWriter Excel object.
        df.to_excel(writer, sheet_name='Sheet1',startrow=count ,header=False, index=False )
        count=count+1
        # Close the Pandas Excel writer and output the Excel file.

        writer.save()