2017-08-07 160 views
1

我有一个看起来像这样的表文件插入空格“”到一个表文件:使用Python来分隔列

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 

正如你可以看到有超过应采取预期的空间一定的价值和摆脱列之间的空间,导致我的代码无法读取文件,指出有比其他列少的列。

一个好处是,我可以知道这种情况发生在哪个确切的列(可能发生在几个文件中),所以我可以实现一个代码或函数,将空格插入到文件的每一行的这些列中。

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

+0

在创建文件的过程中是否可以对这个问题进行排序?你也关心文件的可读性吗?特定的列是否有特定的数字位数? – Laszlowaty

+0

这些文件已经创建并交给我了。我将需要返回这些文件,解决这个问题,所以他们需要有相同的顺序。示例中的两个冲突列可能每个都少一个数字。 –

回答

1

我看到它的方式,如果您不确切知道所有“错误”在哪里,您将不得不阅读整个文件。

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

我也建议看看Vim的块状视觉模式。 例如(从jubi修改):

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

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

希望工程!

+0

我使用了Vim并按照你的步骤工作,完全按照我的想法工作。虽然滚动~30K线需要一点点(可能有更快的方法来达到底线),但它解决了这个问题就好了。谢谢!我感谢你的时间。 –

1

首先要做的事情。生成文件后无法解决此问题。想象一下,您已将列合并到: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。请注意0​​。 没有办法将其分成两列。

这里最好的办法将是使用不同的列分隔符的原始文件(文件创建过程中) - 例如;因为它不是作为十进制分隔符和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