【问题标题】:Return rows in text file返回文本文件中的行
【发布时间】:2020-07-01 00:24:36
【问题描述】:

在前端(React),用户上传文本文件并通过 POST 请求将其发送到后端(Flask)。 我通过 file = request.files['file'] 获取文件。 现在,有时文本文件可能包含几行不被视为列标题的信息。例如,它可能看起来像:

2020-06-30
Users's name
Company

column1 name   column2 name   column3 name
data           data           data
data           data           data

现在,如果我使用 pandas,我会运行以下代码:

import pandas as pd

read_file = pd.read_csv(file, delimiter="\t", error_bad_lines=False, header=None, nrows=50)

它将返回文本文件的前 3 行并跳过其余行并显示错误:expected 1 fields, saw 3

我需要返回文本文件中出现的前 50 行。我该怎么做?

【问题讨论】:

    标签: python python-3.x reactjs pandas flask


    【解决方案1】:

    类似:

    df = pd.read_csv(fname, skiprows=4, **all_your_kwargs)

    【讨论】:

    • skiprows 的问题在于它总是会根据给出的数据而变化。有时没有什么可以跳过的,它可以直接进入列标题和数据。有时,列标题会从文件的更深处开始。
    • 编写一个函数,通过检查数据来计算要跳过的行数
    • 你不能找到第一行有标签的吗?
    • 您好!虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高帖子的质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的回答添加解释并说明适用的限制和假设。
    • 感谢@Brian,这是有用的反馈。在这种情况下,我认为skiprows 是不言而喻的,我不确定我什至可以写什么来澄清它。
    【解决方案2】:

    这是我在不忽略非标题行的情况下返回整个文本文件所必须做的事情

    file = request.files['file']
    file_decoded = file.read().decode('utf-8')
    file_data = pd.read_csv(io.StringIO(file_decoded), error_bad_lines=False,
        delimiter='\n', header=None, nrows=50)
    

    然后发送到前端:

    jsonized = file_data.to_json(orient='values')
    #to_json is a pandas function
    

    json 现在在前端看起来像这样:

    [
      ["2020-06-30"],
      ["user's name"],
      ["company"],
      ["column1 name   column2 name   column3 name"],
      ["data  data  data"]
    ]
    

    我会通过orient继续玩json的格式

    【讨论】:

      【解决方案3】:

      读取行的示例如下:

      file = open("test_file.txt", 'r')
      
      for position, line in enumerate(file):
          if position in range(0, 50):
              print(line)
      

      我不太了解 panda,无法将其实现到您的代码中,但您应该能够将其复制到您的代码中。

      【讨论】:

      • 谢谢。但我收到此错误:TypeError: expected str, bytes or os.PathLike object, not FileStorage 因为行 file=request.files['file'] 实际上是 FileStorage (flask/werkzeug) 的一个实例。
      • 这只会得到第 0 行和第 49 行,因为 1 到 48 不在 lines_to_read 中。那应该是range(0,50)
      • 还是错了。它必须是range(0, 50)。使用range(0, 49) 只会计数到 48。range 中的第二个数字需要比您要停止的数字多 1。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 2019-05-24
      • 2022-08-18
      • 2012-09-21
      • 2022-08-19
      • 2013-09-12
      相关资源
      最近更新 更多