Python 自动更新CSV文件
我最近(5小时前)开始学习Python。这是我的设想 我每4小时从远程测量站点收到一封带有测量值的邮件。文件为*.csv格式,文件名为Python 自动更新CSV文件,python,csv,Python,Csv,我最近(5小时前)开始学习Python。这是我的设想 我每4小时从远程测量站点收到一封带有测量值的邮件。文件为*.csv格式,文件名为XX-2011-00001.csv和YY-2011-00001.csv。这些是以不同采样间隔连续运行的两台仪器的数据。这些文件存储在本地文件夹中 我想开发一个脚本,读取一个文件(例如:XX-2011-00001.csv),然后用相同的数据编写一个新的csv文件。4小时后,脚本应再次运行,现在仅读取新文件XX-2011-00002.csv,并将此数据附加到创建的新c
XX-2011-00001.csv
和YY-2011-00001.csv
。这些是以不同采样间隔连续运行的两台仪器的数据。这些文件存储在本地文件夹中
我想开发一个脚本,读取一个文件(例如:XX-2011-00001.csv
),然后用相同的数据编写一个新的csv文件。4小时后,脚本应再次运行,现在仅读取新文件XX-2011-00002.csv
,并将此数据附加到创建的新csv文件中。我想让这个脚本在无限循环中运行,这样脚本就可以检查新文件并将其添加到CSV文件中
该文件包含“日期”、“时间”和“值”字段
你能帮我告诉我在写这个脚本时应该研究的模块吗?如果您有任何例子,我将非常感谢。有一个
csv
模块可以帮助您。你可能会想研究一下time.sleep()
,尽管有更好的方法来处理这个问题(但考虑到你对语言的陌生程度,time.sleep()
可能是一个很好的起点)。你不需要任何外部模块来读/写文件,但导入csv模块可能对您有利,具体取决于您希望如何使用数据。查看有关此的信息。基本上,您要做的是运行一个“while(1):”作为程序的主要部分。这将无限期执行,直到您强制程序退出或遇到错误。您可以使用try/except块优雅地退出,但这超出了您所要求的范围
我假设csv文件的命名方案是可以通过算法确定的(因为它似乎只是一个日期和数字)。循环应该检查下一个值是什么,或者应该查找最大的数值作为文件名。在这种情况下,您需要保存文件名的前一个值,并且仅当值与存储的前一个值发生更改时才执行代码
有关使用csv模块读取/写入csv的信息,请查看
编辑:忘记了时间延迟。这在先前的答复中得到了答复。使用时间模块和运行时间。sleep(x),其中x是程序在主循环迭代之间休眠的时间(以秒为单位)。正如其他人所说,
csv
包包含大量对象,可以在不编写大量低级代码的情况下处理文件I/O
但是,我会使用cron
作业来实现时间要求,而不是在应用程序可用的情况下休眠应用程序。它将更加灵活,而且如果您不观看应用程序,它不会受到单个意外崩溃的影响而停止应用程序。将有助于读取/写入您的文件。您将希望在睡眠中使用无限循环--类似于:
while True:
process_new_file() # does nothing if no new file
time.sleep(60)
process\u new\u file
需要检查是否有新文件,这可能很棘手——您不想在文件写入完成之前尝试使用它!像这样的方法应该会奏效:
def check_for_new_file(directory=INCOMING, files={}):
for file in os.listdir(directory):
if file in files:
break
size = os.stat(file)[stat.ST_SIZE]
files[file] = (datetime.time.now(), size)
now = datetime.time.now()
for file, last_time, last_size in files.items():
current_size = os.stat(file)[stat.ST_SIZE]
if current_size != last_size:
files[file] = (now, current_size)
continue
if now - last_time <= TIME_WITH_NO_WRITES:
return file
raise NoneReady()
要将其全部放在一起,包括导入和全局:
import os
import stat
import shutil
INCOMING = '/some/path/with/new/files/'
PROCESSED = '/some/path/for/processed/files/'
TIME_WITH_NO_WRITES = 600 # 10 minutes
def check_for_new_file(directory=INCOMING, files={}):
for file in os.listdir(directory):
if file in files:
break
size = os.stat(file)[stat.ST_SIZE]
files[file] = (datetime.time.now(), size)
now = datetime.time.now()
for file, last_time, last_size in files.items():
current_size = os.stat(file)[stat.ST_SIZE]
if current_size != last_size:
files[file] = (now, current_size)
continue
if now - last_time <= TIME_WITH_NO_WRITES:
return file
raise NoneReady()
def process_new_file():
try:
filename = check_for_new_file() # raises ValueError if no file ready
except NoneReady:
return
in_file = open(filename, 'rb')
csv_file_in = csv.reader(in_file)
out_file = open(MASTER_CSV, 'rb+')
csv_file_out = csv.writer(out_file)
for row in csv_file_in:
csv_file_out.write(row)
csv_file_out.close()
csv_file_in.close()
shutil.move(filename, PROCESSED)
if __name__ == '__main__':
while True:
process_new_file() # does nothing if no new file
time.sleep(60)
导入操作系统
进口统计
进口舒蒂尔
传入='/some/path/with/new/files/'
已处理='/some/path/for/PROCESSED/files/'
没有写入的时间=600#10分钟
def check_查找新文件(目录=传入,文件={}):
对于os.listdir(目录)中的文件:
如果文件中有文件:
打破
size=os.stat(文件)[stat.ST\u size]
files[file]=(datetime.time.now(),大小)
now=datetime.time.now()
对于文件,上次时间,文件中的上次大小。items():
当前大小=os.stat(文件)[stat.ST\u大小]
如果当前_大小!=最后尺寸:
文件[文件]=(现在,当前大小)
持续
如果现在是最后一次,非常感谢大家宝贵的时间。非常感谢Ethan对您的详细描述。如果答案中有一个适合您,您应该单击旁边的复选标记接受它。祝你好运
import os
import stat
import shutil
INCOMING = '/some/path/with/new/files/'
PROCESSED = '/some/path/for/processed/files/'
TIME_WITH_NO_WRITES = 600 # 10 minutes
def check_for_new_file(directory=INCOMING, files={}):
for file in os.listdir(directory):
if file in files:
break
size = os.stat(file)[stat.ST_SIZE]
files[file] = (datetime.time.now(), size)
now = datetime.time.now()
for file, last_time, last_size in files.items():
current_size = os.stat(file)[stat.ST_SIZE]
if current_size != last_size:
files[file] = (now, current_size)
continue
if now - last_time <= TIME_WITH_NO_WRITES:
return file
raise NoneReady()
def process_new_file():
try:
filename = check_for_new_file() # raises ValueError if no file ready
except NoneReady:
return
in_file = open(filename, 'rb')
csv_file_in = csv.reader(in_file)
out_file = open(MASTER_CSV, 'rb+')
csv_file_out = csv.writer(out_file)
for row in csv_file_in:
csv_file_out.write(row)
csv_file_out.close()
csv_file_in.close()
shutil.move(filename, PROCESSED)
if __name__ == '__main__':
while True:
process_new_file() # does nothing if no new file
time.sleep(60)