【问题标题】:Inserting spaces " " into a table file using Python to separate columns使用 Python 在表格文件中插入空格“”以分隔列
【发布时间】:2017-08-07 16:30:47
【问题描述】:

我有一个如下所示的表格文件:

3 5415.00    6.00 -1998.3 -781.28 21.98 9.99 3.41  21.63 0.94 1.29 0 -98.04  98.04
4 6443.00    6.00 -1998.3-1216.10 21.71 0.35 0.38  22.78 8.00 3.00 2 -98.04  98.04
5 5806.00    7.00 -1997.8 -946.67 21.04 0.19 0.19  23.26 6.27 0.97 0   2.23  -2.23
6 7882.00    8.00 -1997.4-1824.80 22.18 0.58 0.49  22.62 0.85 0.85 0   0.44  -0.44
7 3278.00    9.00 -1997.0  122.67 20.94 0.24 0.20  23.53 8.00 0.24 2 -98.04  98.04

如您所见,某些值超出了它应该占用的预期空间并消除了列之间的空间,导致我的代码无法读取文件,并指出列数少于其余列。

一个优点是我可以知道这发生在文件的哪些确切列(可能发生在几个)中,因此我可以实现一个代码或函数,在文件的每一行的这些列中插入一个空格。

我对写/读文件不是很熟悉,所以我猜上面的想法是解决这个问题的最简单方法。干杯。

【问题讨论】:

  • 在创建文件的过程中能否解决这个问题?你还关心文件的可读性吗?特定列是否有特定位数?
  • 文件已经创建并交给了我。我需要在修复了这个问题的情况下返回这些文件,因此它们需要具有相同的顺序。示例中的两个冲突列可能各少一位。

标签: python file numpy jupyter-notebook fwrite


【解决方案1】:

在我看来,如果你不知道所有“错误”的确切位置,那么无论如何你都必须阅读整个文件。

如果这是真的,我想说你的方法(在 n 列的每一行中添加一个空格)实际上非常有效。

我还建议研究 Vim 的分块可视模式。 例如(修改自jubi):

  1. 转到您需要的列
  2. Ctrl + v(进入可视模式)
  3. 使用箭头键选择行
  4. Shift + i(带您进入插入模式)
  5. 在所选行前面按空格键或您想输入的任何内容。
  6. 保存更改(使用 :w),现在您将看到所有选定行中的更改。

这是另一个来源:How to insert a block of white spaces starting at the cursor position in vi?

希望它有效!

【讨论】:

  • 我使用 Vim 并按照您的步骤操作,完全按照我的意愿工作。虽然滚动大约 30k 行需要一点时间(可能有一种更快的方法可以到达底线),但它很好地解决了问题。谢谢!感谢您的宝贵时间。
【解决方案2】:

首先要做的事情。生成文件后无法解决此问题。假设您已将列合并到:6 7882.00 8.00 -1997.41824.80 22.18 0.58 0.49 22.62 0.85 0.85 0 0.44 -0.44。注意-1997.41824.80无法将其分成两列。

这里最好的方法是在原始文件中使用不同的列分隔符(在创建文件期间) - 例如;,因为它不用作十进制分隔符,并且通常用于 csv 文件。

解决此问题的第二种方法只有在您知道列中有多少位数时才有效(这里不是这种情况,因为您提供的示例中位数不同)。

收到带有不同分隔符的文件后,您的数据应如下所示:

3;5415.00;6.00;-1998.3;-781.28;21.98;9.99;3.41;21.63;0.94;1.29;0;-98.04;98.04

然后您可以使用csv 库、pandas.read_csv(),或编写如下所示的自定义代码:

file_with_data = open("filename.txt", "r")
raw_data = file_with_data.read()
file_with_data.close()
rows = raw_data.split("\n")  #splitting whole file to list containing rows
for row in rows:
    print(row.split(";"))  # splitting row data into values based on the ; seperator

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 2016-09-26
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多