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

标签 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

最佳答案

从文本文件开头删除一行的唯一方法是重写整个文件,跳过该行。您可以在 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 来处理该情况>/finallyatexit。 (当然,如果有人拔掉计算机的插头,这将无济于事……但是如果有人在您重写整个文件时拔掉插头,您将遇到更糟糕的问题。并且此更改使该问题的可能性降低。)因此:

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')

这是一个有点 hacky 的实现。首先,您可能想要使用,例如 tempfile.NamedTemporaryFile而不是硬编码名称。其次,在 Windows 上,如果其中一个文件打开,则不能将一个文件移动到另一个文件上。事实上,确实没有什么好方法来“原子地”替换文件。您能做的最好的事情就是跟踪临时文件的名称,然后在关闭这两个文件后,尽快 os.remove('superlikelist.txt') 然后执行 rename.

关于python - 使用文本文件中的行作为函数的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20647766/

相关文章:

java - 如何格式化 JSON 中的多行字符串

json - 无法找到内容类型为application/json的MessageBodyReader并键入类java.lang.String

java - 如何通过 Java 的 Runtime api 获取 Java 程序使用的内存?

python - 将 Azure Blob 存储中的新 CSV 加载到 SQL DB

python - 在 Spark : Executor lost 中获取错误

json - 与颜色相关的 flutter 图像

Mongodb TypeError : vehicle. 保存不是函数

javascript - 如何使用 Javascript 排除不存在的 JSON 数据?

python - 如何在 Flask、nginx、uwsgi 堆栈中重新加载 python 库?

python - lxml 和 CDATA 和 &