我对此完全陌生,所以请容忍我的缺乏理解。
我想要 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
来处理该情况>/finally
或 atexit
。 (当然,如果有人拔掉计算机的插头,这将无济于事……但是如果有人在您重写整个文件时拔掉插头,您将遇到更糟糕的问题。并且此更改使该问题的可能性降低。)因此:
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/