【问题标题】:Looping through a list read by pickle to find userid循环通过pickle读取的列表以查找用户ID
【发布时间】:2013-06-18 01:20:36
【问题描述】:

我在循环通过 pickle 读取的列表时遇到问题。这段代码的最终目的是遍历每个 Item 并返回每个 item 的 id 号。

## Opening the file, and loading it into a list##
with open('TEMP_ITEMS.txt', 'rb') as openfile:
    items = pickle.load(openfile)

我尝试循环并查找 id 编号的尝试是基于一些旧的 xml 抓取技术,但由于某种原因,该逻辑不适用于此处。

for item in enumerate(items):

    pattern0 = re.compile('ID: (.*?) <br>')
    idnumber = float(re.findall(pattern0, items[0])[0])
    print "ID Number: ",idnumber 

TEMP_ITEMS.txt 内容示例

(lp0
S'\n                <item>\n                    <title>Timmy</title>\n                    <link>caturl</link>\n                    <description><![CDATA[\n                                Timmy <br>\n                                ID: 3712 <br>\n                                Age: 10 <br>\n                                Weight: 7lbs <br>\n                                Time: 17:23 <br>\n                                Cat Name: Timmy <br>\n\n                    ]]></description>\n                    <guid isPermaLink="false">04e72b29-065d-4893-a4d2-f16ff30a283e</guid>\n                    <pubDate>Fri, 21 Jun 2013 01:09:05 GMT</pubDate>\n                </item>'
p1
aS'\n                <item>\n                    <title>George</title>\n                    <link>caturl</link>\n                    <description><![CDATA[\n                                George <br>\n                                ID: 4124 <br>\n                                Age: 14 <br>\n                                Weight: 8lbs <br>\n                                Time: 15:41 <br>\n                                Cat Name: George <br>\n\n                    ]]></description>\n                    <guid isPermaLink="false">212f9fbf-564b-470a-a64a-ef51036ff06a</guid>\n                    <pubDate>Fri, 21 Jun 2013 01:28:20 GMT</pubDate>\n                </item>'
p2
a.

对于这个问题的任何帮助或建议将不胜感激。亲切的问候 AEA

在falsetru推荐下使用的代码,返回错误

import pickle
import re

with open('TEMP_RSS_ITEMS.txt', 'rb') as temp_rss_items_open4:
    items = pickle.load(temp_rss_items_open4)        
    print items
    for item in enumerate(items):
        pattern0 = re.compile('ID: (.*) <br>')
        for idnumber in re.findall(pattern0, item):
            print idnumber

它产生的代码出错:

Traceback (most recent call last):
  File "C:/Sharing/test1.py", line 9, in <module>
    for idnumber in re.findall(pattern0, item):
  File "C:\Python27\lib\re.py", line 177, in findall
    return _compile(pattern, flags).findall(string)
TypeError: expected string or buffer
>>> 

【问题讨论】:

  • pattern0 = re.compile(...); re.findall(pattern0)没有item的业务?
  • 你好@iMom0 我还在学习编码,如果有什么看起来非常明显的错误,那么它可能是。

标签: python list loops python-2.7 pickle


【解决方案1】:

尝试使用.* 的非贪婪版本:

pattern0 = re.complie(r'ID: (.*?) <br>')

如果 ID 只有数字,则为“+”:

pattern0 = re.complie(r'ID: (\d+)')

更新

import pickle
import re

pattern0 = re.compile('ID: (.*) <br>')
with open('TEMP_RSS_ITEMS.txt', 'rb') as f:
    items = pickle.load(f)        
    for item in items:
        for idnumber in pattern0.findall(item):
            print idnumber

【讨论】:

  • 感谢@falsetru 的回答,我已经设法通过更改为for item in enumerate(items): 解决了此代码的第一个问题,现在的问题是循环脚本只返回列表中的第一项,我希望它在第一个循环中返回第一个项目的 id,然后返回列表中第二个项目的 id,依此类推。有什么想法吗?
  • 嘿,谢谢@falsetru,不幸的是它仍然返回错误,我输入了使用的代码并在问题结束时返回了错误。还有什么想法吗? :S
  • re.findall(pattern0, item) 是我的错。应该是pattern0.findall(item)
  • float 是不需要的,除非你用 id 做一些算术运算。
  • re.findall(....)[0] 仅返回第一个匹配项。如果只有一场比赛,这将不是问题。
【解决方案2】:

尝试将项目 [0] 替换为项目:

for item in enumerate(items):
    pattern0 = re.compile('ID: (.*?) <br>')
    idnumber = float(re.findall(pattern0, item)[0])

如果您要遍历每个项目,那么为什么不使用每个项目?

【讨论】:

  • 为答案干杯我确实尝试过它返回此错误:TypeError: expected string or buffer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
相关资源
最近更新 更多