【问题标题】:How to read text file with multiple whitespaces python/spark [duplicate]如何读取具有多个空格的文本文件python / spark [重复]
【发布时间】:2021-06-09 14:45:56
【问题描述】:

我有 .txt 文件,我尝试使用 python/spark 读取该文件,但它要么被转换为一个大字符串,要么我无法以正确的格式获取数据。

我注意到有时数据文件中有多个空格。

数据集

import io
data_str = """value          code    description                 version     plant        ing_code       weight                   created              end               
NULL             (Nxt) Optigroei PreStart Kruimel      170        Wan         2132.00          19.800000000010389 2020-07-27 14:15:55.000 2020-07-27 14:15:55.000   
NULL             (Nxt) Optigroei PreStart Kruimel      170        Wan          1808.00          0.55000000000025961 2020-07-27 14:15:55.000 2020-07-27 14:15:55.000 
NULL             (Nxt) Optigroei PreStart Kruimel      170        Wan          1672.00         5.9999999999999998E-2 2020-07-27 14:15:55.000 2020-07-27 14:15:55.000    
NULL             (Nxt) Optigroei 3 Meel                370        Wan          1253.00          1.21 2020-07-29 06:30:10.000 2020-07-29 06:30:10.000    
NULL             (Nxt) Optigroei 3 Meel                370        Wan           1582.00        9.9000000000061018E-3 2020-07-29 06:30:10.000 2020-07-29 06:30:10.000    
NULL             (Nxt) Optigroei Start Meel            570        Wan          2132.00         24.800000000000001 2020-07-29 06:32:38.000 2020-07-29 06:32:38.000"""
data_io = io.StringIO(data_str)

代码

import pandas as pd

pd.read_csv(data_io)
df_pd = pd.read_csv(data_io,  sep='\s\s+')

如果有任何帮助/建议,我将不胜感激

提前致谢

【问题讨论】:

  • 您可以尝试在read_csv 函数调用中传递此选项吗? delim_whitespace=True
  • 但是你如何区分值中有空格的第三列
  • 在您的数据中,code 和 description 列之间有一个空格,因此您的正则表达式作为分隔符无效,但如果将其更改为 \s+,您将在 @987654329 中获得额外数据@ 看起来您需要对输入数据进行一些处理

标签: python pandas apache-spark data-wrangling


【解决方案1】:

您的文件可能是固定宽度文件。也就是说,如果您在文本编辑器中打开它,列宽将全部相同(而不是使用像 , 或 \s 这样的分隔符)。 Pandas 自带读取固定宽度文件的内置函数:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_fwf.html

import pandas as pd
pd.read_fwf("/dbfs/FileStore/tables/df.txt")

编辑

感谢上传字符串,让调试更准确!您的某些列的值带有单个空格,而某些列由单个空格分隔。您将无法使用 pandas 内置函数,但您可以使用正则表达式自行解析数据。例如:

import io
import re
data_str = """value          code    description                 version     plant        ing_code       weight                   created              end               
NULL             (Nxt) Optigroei PreStart Kruimel      170        Wan         2132.00          19.800000000010389 2020-07-27 14:15:55.000 2020-07-27 14:15:55.000   
NULL             (Nxt) Optigroei PreStart Kruimel      170        Wan          1808.00          0.55000000000025961 2020-07-27 14:15:55.000 2020-07-27 14:15:55.000 
NULL             (Nxt) Optigroei PreStart Kruimel      170        Wan          1672.00         5.9999999999999998E-2 2020-07-27 14:15:55.000 2020-07-27 14:15:55.000    
NULL             (Nxt) Optigroei 3 Meel                370        Wan          1253.00          1.21 2020-07-29 06:30:10.000 2020-07-29 06:30:10.000    
NULL             (Nxt) Optigroei 3 Meel                370        Wan           1582.00        9.9000000000061018E-3 2020-07-29 06:30:10.000 2020-07-29 06:30:10.000    
NULL             (Nxt) Optigroei Start Meel            570        Wan          2132.00         24.800000000000001 2020-07-29 06:32:38.000 2020-07-29 06:32:38.000"""

line_regex = re.compile("(\w+)\s+\((\w+)\)\s+((?:[\w]+\s){0,3})\s+(\d+)\s+(\w+)\s+([\d\.]+)\s+([\d\.E-]+)\s([\d-]+ [\d:\.]+)\s([\d-]+ [\d:\.]+)")
data = []
for i, line in enumerate(data_str.split("\n")):
    if not i: # get header from first line
        columns = re.split("\s+", line.strip())
    else:
        data.append(re.match(line_regex, line).groups())
df = pd.DataFrame(data, columns=columns)

您可以修改每个正则表达式捕获组以匹配您在该列中的预期数据类型。我喜欢使用https://pythex.org 作为尝试正则表达式的游乐场。

【讨论】:

  • 最后一列没有分开,顺便说一句,我更新了 OP 问题,现在你可以自己轻松测试了
  • 添加了一个通过正则表达式处理的示例。
猜你喜欢
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 2020-07-30
  • 1970-01-01
相关资源
最近更新 更多