【问题标题】:Python 3.9: For loop is not producing output files eventhough no errors are displayedPython 3.9:即使没有显示错误,For 循环也不会产生输出文件
【发布时间】:2021-05-23 07:18:21
【问题描述】:

大家,我对使用 python 进行数据分析还很陌生,所以对愚蠢的问题表示歉意:

IDE:PyCharm

我有什么: 一个巨大的 .xyz 文件(有 4 列),它是几个数据集的组合,每个数据集可以由文件的第三列确定,从 10,000 到 - 10,000 个,中间为 0,间隔和重复为 100(因此每 201 行是一个数据集)

我想要做的:将海量文件拆分为单独的数据集(每个数据集 201 行),并以不同的名称保存每个文件。

到目前为止我做了什么:

# Import packages

import os
import pandas as pd
import numpy as np #For next steps
import math #For next steps

#Check and Change directory

path = 'C:/Clayton/lines/profiles_aufmod'
os.chdir(path)
print(os.getcwd()) #Correct path is printed

# split the xyz file into different files for each profile

main_xyz = 'bathy_SPO_1984_50x50_profile.xyz'

number_lines = sum(1 for row in (open(main_xyz)))
print(number_lines) # 10854 is the output
rowsize = 201

for i in range(number_lines, rowsize):
    profile_raw_df = pd.read_csv(main_xyz, delimiter=',', header=None, nrows=rowsize,
                                 skiprows=i)
    out_xyz = 'Profile' + str(i) + '.xyz'
    profile_raw_df.to_csv(out_xyz, index=False,
                          header=False, mode='a')

我面临的问题:

  • for 循环最初提供输出文件,如图所示,检查 Proof of output 但现在它不会产生任何输出,也不会重写以前的文件。另一个谜团是我也没有收到错误,请查看Code executed without error

我试图解决的问题:

  • 我更新了所有的包并重启了 Pycharm
  • 我逐行运行每一行代码,一切正常,直到 for 循环

【问题讨论】:

  • 如果你的文件超过200行,范围显然是空的。
  • 您好 Jörg,感谢您抽出宝贵时间,我的文件确实有 200 多行(准确地说是 10854),但正如我之前提到的,上面的代码确实运行并给了我之前的输出文件,它只是不再工作了。再次抱歉这里有任何愚蠢的疏忽。
  • 从 10854 到 201 的范围是空的,因此循环永远不会执行,因为没有什么可以迭代。
  • 我明白了,有没有更好的方法来为上述目的编写 for 循环?再次感谢您的宝贵时间
  • 我首先不明白在从行数到行大小的范围内进行迭代的目的是什么。这对我来说毫无意义。

标签: python-3.x pandas dataframe for-loop split


【解决方案1】:

同时计算行数

number_lines = sum(1 for row in (open(main_xyz)))

您已经用尽了遍历文件行的迭代器。但是您没有关闭该文件。但这不应该阻止 Pandas 读取同一个文件。

更好的成语是

with open(main_xyz) as fh:
  number_lines = sum(1 for row in fh)

你的 for 循环并没有做你可能想要的。我猜你想要:

for i in range(0, number_lines, rowsize):

所以,rowsize 是步长,而不是 for 循环的结束值。

如果要按数据集对输出文件进行编号,请保留数据集的计数,如下所示


data_set = 0
for i in range(0, number_lines, rowsize):
    data_set += 1
    ...
    out_xyz = f"Profile{data_set}.xyz"
    ...
    

【讨论】:

  • 亲爱的 Dirk, 非常感谢您的帮助,它确实运行良好并且符合要求。我刚刚有一个切题的问题,我的新文件正如您所期望的那样命名为 profile0, profile201,profile402... 基于 'i' 。我希望将它们命名为 profile0、profile1、profile2 .....profile54,是否需要嵌套的 for 循环?提前致谢
  • 不需要嵌套的 for 循环,请参阅我编辑的答案。
  • 再次感谢,解决了我所有的问题!感谢您的宝贵时间!
猜你喜欢
  • 2016-08-09
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 2019-10-24
相关资源
最近更新 更多