我对此非常陌生,所以请不要理解。
我想要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
答案 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)
做类似的事情:
f = open('superlikelist.txt', 'rw')
first_line = f.readline()
#remove one line from file.
os.system("sed -i -e '1d' " + f)
类似的讨论here。