【问题标题】:to_csv command in For loop not working as expectedFor 循环中的 to_csv 命令未按预期工作
【发布时间】:2019-01-31 05:18:39
【问题描述】:

我的目录中有 11 个以“case-export-”开头的文件。对于这些文件中的每一个,我只想提取“initial_columns”变量中指示的 5 列,将结果保存到名为“whole_file”的数据帧中,并将“whole_file”数据帧写入 CSV。因为我的目录中有 11 个与“case-export-”匹配的文件,所以我的脚本应该有 11 个 CSV。

当我运行下面的脚本时,我只生成了 1 个 CSV,并且该 CSV 包含 For 循环读取的最新文件中的数据。

date = dt.datetime.today().strftime("%m_%d_%Y")
directory = '/Users/myname/Downloads/'
initial_columns = ['Case #','Case Subject','Created At','Labels','Body'] 

for file in (glob.glob(directory + 'case-export-*')):
    whole_file=pd.read_csv(file, usecols = initial_columns, encoding='ISO-8859-1', index_col=None, low_memory=False).replace(np.nan, 'blank', regex=True)   
    whole_file.to_csv(directory + 'case_export_trimmed_' + date + '_' + str(now.hour) + '_' + str(now.minute) + '_' + str(now.second) + '.csv')

我知道如何通过添加一个空数据帧然后在每个“whole_file”通过循环时将它连接到数据帧来解决这个问题。我试过了,效果很好。但是,我试图理解为什么我上面显示的原始脚本没有按预期工作,以及为什么它只生成 1 个 CSV 而不是 11 个。请告知。

【问题讨论】:

  • 我认为这是因为文件命名中使用了时间和日期。每个文件名将与在 1 sec 内运行的循环完成时相同,而不是使用 whole_file.to_csv(directory + 'case_export_trimmed_' + str(i)+ '.csv') ,在 for 循环中每次递增 i
  • 另一种方法是在每次迭代之间休眠一秒钟:D

标签: python pandas for-loop export-to-csv


【解决方案1】:

我认为这样做的原因是 now 是在您拥有的 for 循环之外定义的。因此,每次您使用它时,在 csv 文件名中使用相同的小时、分钟和秒,因此您每次都覆盖一个文件。

如果你将 now 变量定义移动到你的 for 循环中,它应该可以工作:

for file in (glob.glob(directory + 'case-export-*')):
    now = datetime.datetime.now()
    date = dt.datetime.today().strftime("%m_%d_%Y")
    whole_file=pd.read_csv(file, usecols = initial_columns, encoding='ISO-8859-1', index_col=None, low_memory=False).replace(np.nan, 'blank', regex=True)   
    whole_file.to_csv(directory + 'case_export_trimmed_' + date + '_' + str(now.hour) + '_' + str(now.minute) + '_' + str(now.second) + '.csv')

*编辑:还在 for 循环中移动 date 定义以获得准确的日期

我还会执行以下操作来生成文件名:

for file in (glob.glob(directory + 'case-export-*')):
    csv_file_name = df.datetime.now().strftime("%m_%d_%Y_%H_%M_%S")
    whole_file=pd.read_csv(file, usecols = initial_columns, encoding='ISO-8859-1', index_col=None, low_memory=False).replace(np.nan, 'blank', regex=True)   
    whole_file.to_csv(directory + 'case_export_trimmed_' + csv_file_name + '.csv')

【讨论】:

    【解决方案2】:

    看来您可能已经在循环之外声明了“日期”和“现在”变量,这意味着

    'whole_file.to_csv(directory + 'case_export_trimmed_' + date + '' + str(now.hour) + '' + str(now.minute) + '_' + str(now .second) + '.csv')'

    对于 11 次迭代中的每一次都将过度写入同一个文件,因此您将在输出文件中仅看到第 11 次迭代的详细信息

    【讨论】:

      【解决方案3】:

      通常,使用日期(小时/分钟/秒)的更好解决方案是保留旧文件名,但前缀或后缀为 trimmed:

      for file in (glob.glob(directory + 'case-export-*')):
          whole_file = pd.read_csv(file, usecols=initial_columns, encoding='ISO-8859-1', index_col=None, low_memory=False).replace(np.nan, 'blank', regex=True)
          trimmed_file = file.replace("case-export-", "case-export-trimmed-")   
          # or trimmed_file = file.replace(".csv", "-trimmed.csv")   
          whole_file.to_csv(trimmed_file)
      

      通过查看文件名,您可以更清楚地记录/了解发生了什么/意图是......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-31
        • 2013-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-24
        • 1970-01-01
        相关资源
        最近更新 更多