如何在循环中跳过项目

Posted

技术标签:

【中文标题】如何在循环中跳过项目【英文标题】:How to skip items in a loop 【发布时间】:2016-09-23 05:08:42 【问题描述】:

我正在尝试创建一个列表,其中包含来自 5 个不同来源的所有报纸文章。它们以JSON 格式存储。所有文章都存储在包含报纸和年份的不同文件中(时间垃圾邮件 2005-2015)。问题是其中一份报纸仅适用于 2014-15,因此当我将所有内容循环在一起时,我会出错。这是我的尝试:

import json
import nltk
import re
import pandas

appended_data = []

for i in range(2005,2016):
    df0 = pandas.DataFrame([json.loads(l) for l in open('SDM_%d.json' % i)])
    df1 = pandas.DataFrame([json.loads(l) for l in open('Scot_%d.json' % i)])
    df2 = pandas.DataFrame([json.loads(l) for l in open('APJ_%d.json' % i)])
    df3 = pandas.DataFrame([json.loads(l) for l in open('TH500_%d.json' % i)])
    df4 = pandas.DataFrame([json.loads(l) for l in open('DRSM_%d.json' % i)])
    appended_data.append(df0)
    appended_data.append(df1)
    appended_data.append(df2)
    appended_data.append(df3)
    appended_data.append(df4)


appended_data = pandas.concat(appended_data)

doc_set = appended_data.body

我的问题是;这段代码是否符合我的目标? (创建一个列表,其中包含每个报纸的所有文章的body);并且,我如何以跳过 2005-2013 年的第一家报纸 (SDM) 的方式对其进行编程

【问题讨论】:

第一个问题没有数据很难回答,但第二个问题可以用os.path.exists测试文件是否存在。 请注意,您应该检查读取是否有效,并且其他文件是否存在以防万一。 您应该关闭文件以避免一次打开太多文件。即使这样行​​得通,最好还是从良好的习惯开始,为以后的项目做好准备。 【参考方案1】:

对于跳过部分,您可以:

for i in range(2005,2016):
    if i > 2013:
        df0 = pandas.DataFrame([json.loads(l) for l in open('SDM_%d.json' % i)])
        appended_data.append(df0)
    df1 = pandas.DataFrame([json.loads(l) for l in open('Scot_%d.json' % i)])

要知道代码是否按预期执行,我们需要这样的示例数据。

【讨论】:

不客气。 cmets 中的os.path.exists() 建议对于您事先不知道哪些文件可能存在或不存在的一般情况也是要牢记的。【参考方案2】:

首先你需要检查python的版本,以确定在Python's "open()" throws different errors for "file not found" - how to handle both exceptions?中解释的找不到文件名时会抛出什么类型的错误

其次,以防万一某些文件出现问题,您应该检查所有可能性。

一种方法是

    创建文件名前缀列表 ['SDM'、'Scot'、'AP'、'TH500'、'DRSM')

    多年循环

    将文件名创建为名称列表中的循环

    try:except 对中打开文件,以便将任何问题作为myfile 处理或者,您也可以在if 中使用os.path.exists() 以避免尝试除外。但是,您应该尝试一下,除了 pair 以外,以防万一出现其他问题。

    将数据读入df = pandas.DataFrame([json.loads(myfile)) 请注意,您还应该将其封装为try ... except

    关闭文件,以免打开太多文件。

    现在将 df 附加到您正在创建的列表中。

这应该可以处理这种情况。

【讨论】:

以上是关于如何在循环中跳过项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 的 for 循环中跳过迭代?

Scanf 在循环中跳过(Hangman)

在循环中跳过一组值(在数组中) - Python3

如何在 SSDT 项目中跳过构建 DACPAC

如何从sql中跳过一行?

为啥 .setValue() 在 for 循环中跳过列?