我正在使用Python 2.7并运行常规抓取任务。我想使用CSV在刮擦之间存储数据。
目前我正在从一个CSV文件中读取数据,逐行将数据写入另一个文件,然后删除并重命名文件:
reader = pd.read_csv('temp1.csv')
reader.set_index('id', inplace=True)
writer = csv.DictWriter(open('temp2.csv', 'wb'), fieldnames=['id', 'links'])
writer.writeheader()
for i, row in reader.iterrows():
# Check if data is already in CSV, if not scrape it.
try:
links = df_links.ix[row['id']]['links']
except KeyError:
links = do_scrape(row['id'])
if links:
df.set_value(i, 'pubmed_links', links)
# Write data out to new CSV file.
writer.writerow({'id': row['id'], 'links': links})
os.remove('temp1.csv')
os.rename('temp2.csv', 'temp1.csv')
有更好的方法吗?具体来说,我可以将任何新数据直接添加到现有文件中,而无需创建和删除文件,并且安全地使得如果网络中断,我不会丢失一半的文件吗?
我知道追加模式,但我正在编辑现有行,而不只是添加新行。
谢谢!
答案 0 :(得分:0)
如果您希望您的解决方案仍然基于文件(显然使用MySQL等纯数据库解决方案会更好),请考虑使用SQLite。 SQLite数据库可以存储为磁盘上的文件,只能传递,但您可以在其上使用大多数数据库函数。 (这些函数将允许您执行"检查数据是否已经在CSV"位。)然后,您可以在SQLite数据库中插入值,而无需创建任何新文件。
现在,如果有一些最终用户想要将数据作为.csv,那么请创建一个使用pd.read_sql()
然后df.to_csv()
的实用程序来为他们提供数据。