Python &引用;列表索引超出范围“;即使在设置高/无限制时也会出错

Python &引用;列表索引超出范围“;即使在设置高/无限制时也会出错,python,list,indexing,range,reddit,Python,List,Indexing,Range,Reddit,这不是我的代码,只是有人试图让它工作。该脚本首先创建一个包含所有链接的.csv文件,然后将其转换为包含相应书签数据的html。问题是它不断抛出“列表索引超出范围”错误。如果我将限制设置为20或50之类的较低值,那么一切都会按预期进行。.csv文件有938行,将限制设置为1000也不起作用 来自命令行的错误消息 File "export-saved.py", line 72, in <module> main() File "export-saved.py", l

这不是我的代码,只是有人试图让它工作。该脚本首先创建一个包含所有链接的.csv文件,然后将其转换为包含相应书签数据的html。问题是它不断抛出“列表索引超出范围”错误。如果我将限制设置为20或50之类的较低值,那么一切都会按预期进行。.csv文件有938行,将限制设置为1000也不起作用

来自命令行的错误消息

 File "export-saved.py", line 72, in <module>
    main()   
   File "export-saved.py", line 68, in main
    converter.convert()   
   File "export-saved.py", line 38, in convert
    urls = self.parse_urls()   
   File "export-saved.py", line 30, in parse_urls
    folder = url[3].strip() 
   IndexError: list index out of range
文件“导出保存的.py”,第72行,在
main()
文件“export saved.py”,第68行,主菜单
convert.convert()
文件“export saved.py”,第38行,转换
url=self.parse_url()
解析URL中第30行的文件“export saved.py”
folder=url[3].strip()
索引器:列表索引超出范围
什么设置了我要输入的数据的可接受范围

另一方面,Reddit显示的保存链接比实际保存的链接要少,这很有趣

附录:好的,我想我已经找到了问题的根源。所以reddit的链接比它显示的要多。事实上,它只显示了大约300个链接,但在他们的服务器中有大约936个链接。当“time”参数定义为“all”时,表示显示的300条链路,因此其他600条链路超出范围。我怎样才能把它们也包括在内?如果这是个问题的话

#!/usr/bin/env python
'''
export-saved.py
Christopher Su
Exports saved Reddit posts into a HTML file that is ready to be imported into Google Chrome.
'''

import csv
import os
import sys
from time import time

import praw
import AccountDetails

## Converter class from https://gist.github.com/raphaa/1327761
class Converter():
    """Converts a CSV instapaper export to a Chrome bookmark file."""

    def __init__(self, file):
        self._file = file

    def parse_urls(self):
        """Parses the file and returns a folder ordered list."""
        efile = open(self._file)
        urls = csv.reader(efile, dialect='excel')
        parsed_urls = {}
        urls.next()
        for url in urls:
            folder = url[3].strip()
            if folder not in parsed_urls.keys():
                parsed_urls[folder] = []
            parsed_urls[folder].append([url[0], url[1]])
        return parsed_urls

    def convert(self):
        """Converts the file."""
        urls = self.parse_urls()
        t = int(time())
        content = ('<!DOCTYPE NETSCAPE-Bookmark-file-1>\n'
                   '<META HTTP-EQUIV="Content-Type" CONTENT="text/html;'
                   ' charset=UTF-8">\n<TITLE>Bookmarks</TITLE>'
                   '\n<H1>Bookmarks</H1>\n<DL><P>\n<DT><H3 ADD_DATE="%(t)d"'
                   ' LAST_MODIFIED="%(t)d">Reddit</H3>'
                   '\n<DL><P>\n' % {'t': t})
        for folder in urls.keys():
            content += ('<DT><H3 ADD_DATE="%(t)d" LAST_MODIFIED="%(t)d">%(n)s'
                        '</H3>\n<DL><P>\n' % {'t': t, 'n': folder})
            for url in urls[folder]:
                content += ('<DT><A HREF="%s" ADD_DATE="%d">%s</A>\n'
                            % (url[0], t, url[1]))
            content += '</DL><P>\n'
        content += '</DL><P>\n' * 3
        ifile = open('chrome-bookmarks.html', 'w')
        ifile.write(content)

def main():
    r = praw.Reddit(user_agent='Subot 1.0')
    r.login(AccountDetails.REDDIT_USERNAME, AccountDetails.REDDIT_PASSWORD)
    export_csv = 'URL,Title,Selection,Folder\n'
    for i in r.user.get_saved(limit=500, time='all'):
        if not hasattr(i, 'title'):
           i.title = i.link_title
        export_csv += ("%s,%s,,%s\n" % (i.permalink.encode('utf-8'), i.title.encode('utf-8'), str(i.subreddit)))
    with open("export-saved.csv", "w") as f:
        f.write(export_csv)
    converter = Converter("export-saved.csv")
    converter.convert()
    sys.exit(0)

if __name__ == "__main__":
    main()
#/usr/bin/env python
'''
export-saved.py
克里斯托弗苏
将保存的Reddit帖子导出到HTML文件中,该文件可以导入到Google Chrome中。
'''
导入csv
导入操作系统
导入系统
从时间导入时间
进口婴儿车
导入帐户详细信息
##来自的转换器类https://gist.github.com/raphaa/1327761
类转换器():
“”“将CSV instapaper导出转换为Chrome书签文件。”“”
定义初始化(自我,文件):
self.\u file=file
def解析URL(自身):
“”“解析文件并返回文件夹顺序列表。”“”
efile=打开(自身文件)
URL=csv.reader(efile,方言='excel')
已解析的_URL={}
url.next()
对于url中的url:
folder=url[3].strip()
如果文件夹不在已解析的_url.keys()中:
已解析的URL[文件夹]=[]
已解析的\u url[文件夹]。追加([url[0],url[1]])
返回解析的URL
def转换(自):
“”“转换文件。”“”
url=self.parse_url()
t=int(time())
内容=('\n'
“\n书签”
“\n书签\n

\n添加” '\n

\n'{'t':t}) 对于URL.keys()中的文件夹: 内容+=('%(n)s' '\n

\n'{'t':t,'n':文件夹}) 对于url[文件夹]中的url: 内容+=('\n' %(url[0],t,url[1])) 内容+='

\n' 内容+='

\n'*3 ifile=open('chrome-bookmarks.html','w') ifile.write(内容) def main(): r=praw.Reddit(用户_-agent='Subot 1.0') r、 登录(AccountDetails.REDDIT_用户名、AccountDetails.REDDIT_密码) export_csv='URL,Title,Selection,Folder\n' 对于r.user.get_saved中的i(limit=500,time='all'): 如果不是hasattr(i,“头衔”): i、 title=i.link\u title 导出csv+=(%s,%s,,%s\n“%(i.permalink.encode('utf-8')、i.title.encode('utf-8')、str(i.subreddit))) 打开(“导出保存的.csv”、“w”)作为f: f、 写入(导出csv) 转换器=转换器(“导出保存的.csv”) convert.convert() 系统出口(0) 如果名称=“\uuuuu main\uuuuuuuu”: main()


主函数中有一个输入错误。url就是试图从csv中的一行索引中获取一个值

但是看看main函数中的第二行export_csv。字符串格式错误-它遗漏了“选择”列中应该包含的内容。在两个连续逗号之间添加一个%s,并为字符串格式设置一个要解压缩的值,这样就可以开始了

(请阅读下面的编辑,因为错误的真正来源确实是字符串格式,但比我原来认为的要微妙一些)


编辑:更多详细信息。当你问“打开包装是什么意思?”时,这可能比你想知道的要多。跳到最后吃一条鱼,或者通读全文来了解更多关于钓鱼的知识

我认为错误在
主功能中。为了调试它,我将把它自己拉出来,并对它进行一些更改。我将重写
main
函数,如下所示:

def debug_main():
    r = praw.Reddit(user_agent='Subot 1.0')
    r.login('USERNAME', 'PASSWORD')
    export_csv = 'URL,Title,Selection,Folder\n'
    for i in r.get_subreddit('all').get_hot(limit=5):
        if not hasattr(i, 'title'):
           i.title = i.link_title
        export_csv += ("%s,%s,,%s\n" % (i.permalink.encode('utf-8'),
                                        i.title.encode('utf-8'),
                                        str(i.subreddit)))

    with open("export-saved.csv", "w") as f:
        f.write(export_csv)

    print 'Complete'
    return True
>>print "%s %s %s %s %s %s" % ("I", "think", "python", "is", "really", "great") 
I think python is really great
def debug_main():
    r = praw.Reddit(user_agent='Subot 1.0')
    r.login('USERNAME', 'PASSWORD')
    export_csv = 'URL,Title,Selection,Folder\n'
    for i in r.get_subreddit('all').get_hot(limit=5):
        title = i.title.replace(',', ' ')
        export_csv += ("%s,%s,,%s\n" % (i.permalink.encode('utf-8'),
                                        title.encode('utf-8'),
                                        str(i.subreddit)))

    with open("export-saved.csv", "w") as f:
        f.write(export_csv)

    print 'Complete'
    return True
现在,该函数不是一次完成所有操作,而是为我们编写CSV文件,然后停止。请记住,当我们将CSV文件传递给转换器时,会遇到错误。这让我觉得我们会在CSV中看到一些格式错误的数据,但我们会发现的

我还做了另一个更改,纯粹是为了调试:

for i in r.get_subreddit('all').get_hot(limit=5):
原始的
for i in r.user.get_saved(limit=500,time='all'):
是我们希望在生产中使用的,但我的个人Reddit帐户没有任何保存的帖子,因此对我没有多大帮助。我们仍然会迭代PRAW提交对象,这对于调试这些东西很重要

现在,让我们将此文件另存为
prawbot.py
,在同一目录中创建一个名为
export saved.csv
的文件,并打开一个shell/terminal来进行pythoning。确保您与
prawbot.py
位于同一目录中,然后启动python shell

让我们导入我们的prawbot,看看他是如何做到的:

>> from prawbot import *
>> debug_main()
Complete
True
到目前为止,一切顺利。我们将Reddit最热门的五个提交导出到CSV(请记住:我们可以通过将该行调回,导出我们最终想要的500个已保存的提交)。让我们打开CSV,看看它是什么样子

好吧,这既令人沮丧又畸形。查看第三行的值是如何出错的?看一下原始代码1
if not hasattr(i, 'title'):
       i.title = i.link_title
    export_csv += ("%s,%s,,%s\n" % (i.permalink.encode('utf-8'),
                                    i.title.encode('utf-8'),
                                    str(i.subreddit)))
>> a = 'cat'
>> b = 'dog'
>> a += b
>> print a
'catdog'
"%s,%s,,%s\n"
>>print "%s %s %s %s %s %s" % ("I", "think", "python", "is", "really", "great") 
I think python is really great
if not hasattr(i, 'title'):
       i.title = i.link_title
title = i.title.replace(',', ' ')
        export_csv += ("%s,%s,,%s\n" % (i.permalink.encode('utf-8'),
                                        i.title.encode('utf-8'),
                                        str(i.subreddit)))
        export_csv += ("%s,%s,,%s\n" % (i.permalink.encode('utf-8'),
                                        title.encode('utf-8'), #note the difference - no i
                                        str(i.subreddit)))
def debug_main():
    r = praw.Reddit(user_agent='Subot 1.0')
    r.login('USERNAME', 'PASSWORD')
    export_csv = 'URL,Title,Selection,Folder\n'
    for i in r.get_subreddit('all').get_hot(limit=5):
        title = i.title.replace(',', ' ')
        export_csv += ("%s,%s,,%s\n" % (i.permalink.encode('utf-8'),
                                        title.encode('utf-8'),
                                        str(i.subreddit)))

    with open("export-saved.csv", "w") as f:
        f.write(export_csv)

    print 'Complete'
    return True
>> from prawbot import *
>> debug_main()
Complete
True
def main():
    r = praw.Reddit(user_agent='Subot 1.0')
    r.login('USERNAME', 'PASSWORD')
    export_csv = 'URL,Title,Selection,Folder\n'
    for i in r.user.get_saved(limit=500, time='all'):
        title = i.title.replace(',', ' ')
        export_csv += ("%s,%s,,%s\n" % (i.permalink.encode('utf-8'),
                                        title.encode('utf-8'),
                                        str(i.subreddit)))

    with open("export-saved.csv", "w") as f:
        f.write(export_csv)
    converter = Converter("export-saved.csv")
    converter.convert()
    sys.exit(0)