Python 自动更新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

我最近(5小时前)开始学习Python。这是我的设想

我每4小时从远程测量站点收到一封带有测量值的邮件。文件为*.csv格式,文件名为
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)