【问题标题】:Copy file - for loop python复制文件-for循环python
【发布时间】:2017-03-22 20:39:43
【问题描述】:

下午好,

我这里有一些代码,旨在根据它们所属的“扇区”将大约 200 个 csv 从源文件夹复制到目标文件夹。它们所属的部门通过“符号列表”标识,其中包含带有代码列表的 csv。该代码适用于 most 部分,除了它在符号列表中获取最终 csv 中的代码列表并将所有这些 CSV 复制到所有目标文件夹中。基本上我需要以某种方式将第一个 for 循环与它下面的 3 个 for 循环结合起来,但我很难做到这一点。非常感谢任何 cmets。

import os,sys,shutil
import glob 
import pandas as pd

source_dir =  'C:\TS'
dest_dir = 'C:\TS\Combined\Groups\Cross Asset Class'
#dest_dir = 'C:\TS\Combined\copytest'
base = 'C:\TS\Combined\Groups'

dest_dirlist = (base +'/Cross Asset Class', base+'/Bonds', base + '/Commodities', \
        base + '/Countries', base + '/Currencies', base + '/Industry Sectors', base + '/Segments and Styles', \
        base + '/Us Sectors', base + '\Volatilities')
print(dest_dirlist)

symbolslist = (base+'/Cross Asset Class.csv', base+'/Bonds.csv',base+'/Commodities.csv' \
                 ,base+'/Currencies.csv', base+'/Industry Sectors.csv', base+'/Segments and Styles.csv', \
                  base+'/US Sectors.csv')


for file in symbolslist:
    print(file)
    df_symbolslist = pd.read_csv(file)
    print(df_symbolslist)


for ticker_file in glob.glob(os.path.join(source_dir, '*.csv*')):
    for ticker in df_symbolslist['Ticker']:
        print(ticker)
        if ticker in ticker_file:
            for path in dest_dirlist:
                shutil.copy(ticker_file, path)
                print(ticker + ' File Copied')

非常感谢您的宝贵时间。

【问题讨论】:

  • df_symbolslist = pd.read_csv(file) 不断覆盖df_symobolslist。您只处理最后一个。我对这里的格式感到困惑……symbollist csv 是什么样的?它们如何编码扇区和符号?
  • 这是符号列表 csv 的样子:prntscr.com/en97is
  • 这是要复制的 csvs 的样子。 prntscr.com/en98d2
  • 符号 csv 的名称是扇区组。 csv 中的单个代码是行业成分。
  • 你能把这些截图转换成文本并在这里发布吗?这让其他人可以更方便地查看正在发生的事情。

标签: python loops copy


【解决方案1】:

如果我正确理解了这个问题,我认为您应该采用稍微不同的方法。您可以创建一个dict,将代码映射到它所属的资产类别列表。然后你那个映射来复制文件。我认为 pandas 在这里没有帮助 - 您可以使用标准 csv 模块逐行构建地图。

我没有测试这段代码,因为我没有合适的数据集,但考虑这样做:

import os,sys,shutil
import glob 
import csv
import collections

source_dir =  r'C:\TS'
dest_dir = r'C:\TS\Combined\Groups\Cross Asset Class'
#dest_dir = r'C:\TS\Combined\copytest'
base = r'C:\TS\Combined\Groups'

# asset classes of interest
asset_classes = ('Cross Asset Class', 'Bonds', 'Commodities',
    'Countries', 'Currencies', 'Industry Sectors', 'Segments and Styles',
    'Us Sectors', 'Volatilities')

# asset class directories indexed by class
dest_dir_index = {asset_class.upper():os.path.join(base, asset_class)
    for asset_class in asset_classes}
print(dest_dir_index)

# make sure destination dirs exist
for dir_name in dest_dir_index.values():
    if not os.path.isdir(dir_name):
        os.mkdir(dir_name)

# dict that creates key:[classes...] item when first accessed, used to keep
# list of asset classes for each ticker symbol.
ticker_to_class_index = collections.defaultdict(list)

for asset_class in asset_classes:
    symbolcsv = "{}.csv".format(os.path.join(base, asset_class))
    print(symbolcsv)
    with open(symbolcsv, newline='') as fp:
        reader = csv.reader(fp)
        next(fp) # skip header
        for sectors, ticker in reader:
            ticker_to_class_index[ticker.upper()].append(asset_class)

# split ticker out of csv filenames and copy file to all asset classes
# mapped for that ticker.
for ticker_file in glob.glob(os.path.join(source_dir, '*.csv*')):
    ticker = os.path.splitext(os.path.basename(ticker_file)).upper()
    print(ticker)
    for asset_class in ticker_to_class_map[ticker.upper()]:
        dest_dir = dest_dir_index[asset_class]
        shutil.copy(ticker_file, dest_dir)
        print("{} copied to {}".format(ticker_file, dest_dir))

【讨论】:

猜你喜欢
  • 2013-03-02
  • 2020-10-18
  • 2021-04-08
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 2017-08-26
相关资源
最近更新 更多