使用文本文件中的行作为函数的数据

时间:2013-12-18 00:56:46

标签: python json api instagram

我对此非常陌生,所以请不要理解。

我想要ulitmatley做的是从文件中获取一行文本,然后将其放入一个url(已经拥有该代码并理解),这将产生结果。加载后需要删除文本文件中的值。这是我到目前为止,脚本使用instagram API查找instagram照片。

import time, random
import urllib,json,urllib2

def getuserId(userId):
userId_Dict = {}
try:
    list_of_users = open('superlikelist.txt', "r")
    for line in list_of_users:
        print line

    return userIdlist

我稍后会使用此

的定义值
def userspics(userId):
numuserspics=0
urlUserMedia = "https://api.instagram.com/v1/users/%s/media/recent/?access_token=%s" % (getuserId,auth_token)
values = {
          'client_id' : client_id}    
try:
    print urlUserMedia
    data = urllib.urlencode(values)
    req = urllib2.Request(urlUserMedia,None,headers)
    response = urllib2.urlopen(req)
    result = response.read()                      
    dataObj = json.loads(result);
    picsForUser = random.randint(1, 3)
    print "Pics for user %s" % (picsForUser, userId)
    countPicViews=0
    for picture in dataObj['data']:
        countPicViews = countPicViews+1
        numLikesFollows = numLikesFollows+1
        if(countPicViews == picsToLike):
            break
except Exception, e:
    print e

2 个答案:

答案 0 :(得分:1)

从文本文件的开头删除一行的唯一方法是重写整个文件,跳过该行。你可以在Python中使用,或者使用像sed这样的外部工具,但无论你做什么,都会发生这种情况。


正如Eli所说,首先将项目复制到某种允许随机访问修改的格式会好得多。例如,您可以使用dbm数据库。 (当然,dbm就像字典一样,不像一个集合......但是你总是可以模拟一个带有无意义值的字典的集合。)

首先,使用此脚本将平面文本文件转换为数据库:

from contextlib import closing
import dbm
db = dbm.open('superlikelist.db', 'n')
with open('superlikelist.txt') as f, closing(db):
    for line in f:
        dbm[line] = ''

现在,你可以这样做:

from contextlib import closing
import dbm

def process_everything():
    db = dbm.open('superlikelist.db', 'w')
    with closing(db):
        for url in db.keys():
            do_something_with(url)
            del db[url]

另一种选择,如果你坚持使用文本文件,就是避免一遍又一遍地重写文件,而只是跟踪在一个单独的地方读取的最后一个行号。像这样:

def process_file():
    try:
        with open('lastread.txt') as lr:
            lastread = int(lr.read())
    except:
        lastread = -1
    with open('superlikelist.txt') as f:
        for i, line in enumerate(file):
            if i > lastread:
                do_stuff_with(line)
                with open('lastread.txt', 'w') as lr:
                    lr.write(str(lastread))

如果必须因某种原因重写原始文件,您至少可以避免为每一行重写它,而只是在流程结束时重写一次。显然你想要确保这种情况发生,即使这个过程的结束是,例如,当你只完成一半时用户点击control-C,但你可以用try / {来处理它{1}}或finally。 (当然,如果有人拔掉电脑上的插头,这将无济于事......但是如果有人在你重写整个文件时拔掉插头,你就会遇到甚至更糟糕的问题。这种变化使得这个问题不太可能发生。)所以:

atexit

这是一个有点hacky的实现。首先,您可能希望使用例如tempfile.NamedTemporaryFile而不是硬编码名称。其次,在Windows上,如果其中一个文件处于打开状态,则不能只将一个文件移动到另一个文件上;实际上,实际上没有“原子地”替换文件的好方法。您可以做的最好是跟踪临时文件的名称,然后在关闭这两个文件后尽快import os def process_file(): with open('superlikelist.txt') as f: try: for line in f: do_stuff_with(line) finally: with open('superlikelist.new', 'w') as fout: fout.writelines(f) os.rename('superlikelist.new', 'superlikelist.txt') 然后执行os.remove('superlikelist.txt')

答案 1 :(得分:0)

  1. 我不建议这样做。这不是文件IO应该用于什么。从队列或数据库中读取项目并在处理每个项目时删除它们要好得多。
  2. 如果你必须这样做,事情会变得有些混乱,绝对不是pythonic,但它会起作用。
  3. 做类似的事情:

    f = open('superlikelist.txt', 'rw') 
    first_line = f.readline()
    #remove one line from file.
    os.system("sed -i -e '1d' " + f)
    

    类似的讨论here