一种Python实现的带缓冲的远程文件本地加载方法
郝伟 2022/10/30 10:19:01 星期天

目标问题

一些简单文件的数据共享存在以下问题:

为解决此问题,本文提出了一种利用云主机Web服务进行数据同步及本地缓冲的方法。

工作原理

  1. 将数据存储在云主机上,通过HTTP服务使用URL共享数据,
    http://121.199.10.158/data.csv
  2. 定义统一云加载函数,对指定的URL对数据进行下载和访问
  3. 为加快数据访问,首次加载时,会在指定的缓冲目录存在数据。
    这样在以后加载时,若本地已经存在缓冲数据则直接加载本地缓冲数据。否则进行远程加载
  4. 还提供了强制加载方法,用于更新本地缓冲数据。
    可以无视本地已有缓冲文件,强制下载远程数据,从而更新本地数据。
  5. 缓冲区文件命名规则
    将目标数据url中的 /: 都替换成 .后的字符串作为文件名。

实现原理

本方法定义了buffer_url_load(url, clear=False, buffer_dir='c:/data/buffered_files/a') 函数用于远程数据加载,具体作用如下:

实现代码

from urllib.request import urlopen
url = 'http://121.199.10.158:8107/c5p8d4he6gjkxm0oq1zrbslt2v37wify9aunx/downloads/pycode/test.py'
url = 'http://121.199.10.158:8107/c5p8d4he6gjkxm0oq1zrbslt2v37wify9aunx/downloads/csv/sample_d41d8cd98f00b204e9800998ecf8427e_s4s.csv'

def buffer_url_load(url, clear=False, buffer_dir='c:/data/buffered_files/a'):
    if not os.path.exists(buffer_dir):
        os.makedirs(buffer_dir)
        print(buffer_dir + ' is created.')
    #else: # 清空所有文件
    #    shutil.rmtree(filepath,ignore_errors=True)
        
    buffer_file = f'{buffer_dir}/{url.replace("/", "_").replace(":", "_")}'
    # 本地加载
    if not clear and os.path.exists(buffer_file):
        print('load locally')
        with open(buffer_file, 'r', encoding='utf-8') as fp:
            data = fp.read()
        return data
    
    # 远程加载
    with urlopen(url) as up:
        data = up.read()
    with open(buffer_file, 'wb') as fp:
        fp.write(data)
    print('load remotely')
    return bytes.decode(data, 'utf-8')

text = buffer_url_load(url)
print(text)