如何用python将行排列成csv文件的列?

Posted

技术标签:

【中文标题】如何用python将行排列成csv文件的列?【英文标题】:How to arrange lines into colums of csv file with python? 【发布时间】:2015-09-16 09:19:59 【问题描述】:

我是一名化学专业的学生,​​我对进行分子的构象分析很感兴趣。为了找到最稳定的构象异构体,我对香豆酸进行了势能表面扫描。通过这个简单的过程,由于原子组围绕键的旋转而导致的不同空间排列被可视化。分子的图像 pes_molecule.png 清楚地显示了链的两个不同的二面体。

用于此目的的程序称为 Gaussian 09,并为前五个构象提供以下 pes5part.csv 输出:

                   1         2         3         4         5
 Eigenvalues --  -570.08934-570.08821-570.08676-570.08521-570.08384
       B1           1.38384   1.38327   1.38324   1.38348   1.38413
       B2           1.38571   1.38662   1.38692   1.38687   1.38631
       A2         119.68274 119.74315 119.80026 119.84218 119.85816
       B3           1.39004   1.38856   1.38754   1.38685   1.38683
       A3         119.90377 119.88911 119.86542 119.83707 119.82679
       D3         359.78590 359.83552 359.88306 359.93484 359.98413
       B4           1.37736   1.37902   1.38023   1.38107   1.38117
       A4         119.75636 119.73537 119.72486 119.72923 119.74312
       D4           0.71367   0.72647   0.69117   0.56509   0.38069
       B5           1.39645   1.39466   1.39330   1.39215   1.39158
       A5         121.33129 121.30763 121.28873 121.27166 121.23298
       D5           0.35956   0.44698   0.45240   0.42630   0.33448
       B6           1.47220   1.47528   1.47926   1.48347   1.48738
       A6         122.40820 121.98088 121.61637 121.36363 121.16036
       D6         180.48284 181.09688 181.65183 182.01495 181.86758
       B7           1.32697   1.32601   1.32486   1.32369   1.32268
       A7         126.15279 125.45399 124.91354 124.58356 124.35302
       D7         326.35068 316.35068 306.35068 296.35068 286.35068
       B8           1.47594   1.47706   1.47838   1.47958   1.48079
       A8         119.99708 120.12965 120.23195 120.29720 120.33716
       D8         180.53457 180.77470 180.92143 180.91869 180.76068
       B9           1.07411   1.07413   1.07416   1.07418   1.07420
       A9         118.93985 118.98599 119.01911 119.04122 119.05329
       D9         181.37285 181.38492 181.22672 180.94401 180.58221
       B10          1.34694   1.34770   1.34843   1.34907   1.34959
       A10        122.64744 122.58131 122.55418 122.55000 122.56749
       D10        180.42161 180.46502 180.42820 180.34924 180.21926
       B11          1.07626   1.07630   1.07630   1.07624   1.07612
       A11        119.03402 119.08722 119.10807 119.12392 119.13418
       D11        179.35212 179.21303 179.20177 179.31786 179.55673
       B12          1.07697   1.07704   1.07710   1.07715   1.07720
       A12        120.07413 120.05334 120.01240 119.97693 119.94390
       D12        180.48654 180.55485 180.52338 180.39366 180.25905
       B13          1.07508   1.07529   1.07540   1.07548   1.07561
       A13        119.03861 119.18885 119.28342 119.31016 119.29960
       D13        181.28569 181.16448 180.90103 180.58626 180.30590
       B14          0.94291   0.94286   0.94282   0.94279   0.94274
       A14        111.19697 111.19860 111.17512 111.14446 111.13678
       D14        359.87694 359.98739 360.03935 359.94679 360.14975
       B15          1.33041   1.33009   1.32973   1.32951   1.32933
       A15        111.93106 111.92554 111.91202 111.89198 111.87131
       D15        180.31345 180.31345 180.31345 180.31345 180.31345
       B16          1.19235   1.19199   1.19165   1.19132   1.19107
       A16        126.00937 125.96822 125.92197 125.88559 125.85792
       D16          0.53326   0.61269   0.54073   0.55376   0.45438
       B17          1.07741   1.07759   1.07781   1.07807   1.07828
       A17        116.61938 117.00542 117.31889 117.52706 117.69428
       D17        149.32579 139.91922 130.07838 119.74879 108.88744
       B18          1.07393   1.07424   1.07440   1.07445   1.07448
       A18        123.00819 122.72745 122.54598 122.45741 122.42974
       D18          0.14076   0.61929   0.95343   1.10958   0.96334
       B19          0.94770   0.94770   0.94774   0.94780   0.94787
       A19        108.07785 108.09603 108.12787 108.16255 108.20337
       D19        180.24961 180.28903 180.28314 180.25552 180.18273

我的目标是创建一个 csv 文件,其安排如下:

    Eigenvalues    D7         D15
    -570.08934  326.35068  180.31345
    -570.08821  316.35068  180.31345
    -570.08676  306.35068  180.31345
    -570.08521  296.35068  180.31345
    -570.08384  286.35068  180.31345

我需要这个的原因是创建能量和两个二面体的 3D PES 图,然后检索具有最低能量的构象。 为此,我创建了以下脚本:

#! /usr/bin/python2.7

import csv
import re

ifile =open('pes5part.csv', 'rb')
infile = csv.reader(ifile)

for line in open('pes5part.csv'):
    rec = line.strip()
    if rec.startswith('Eigenvalues') or rec.startswith('D7') or rec.startswith('D15'):
        print line

当脚本运行时,以下内容会打印到终端中:

 Eigenvalues --  -570.08934 -570.08821 -570.08676 -570.08521 -570.08384

       D7         326.35068 316.35068 306.35068 296.35068 286.35068

       D15        180.31345 180.31345 180.31345 180.31345 180.31345

因此,为了继续进行,我需要您的帮助,以便在第一列中排列特征值的第一行的值。然后是角度 D7 的第二行的值到第二列,最后是角度 D15 的值到第三列,如 **my goal csv file ** above.ccs 中所示

从 Gaussian 输出的包含所有 361 个构象的完整 PES 扫描文件是 pesFULL.csv: 输入 5 小时后,使用所有 361 个构象器手工创建的最终完整的所需 PES 文件是 pes.ods 而最终的 PES 图在文件 pes_graph1.pngpes_graph2.png

中描述

我已将上述所有文件附加到共享保管箱文件夹中https://www.dropbox.com/sh/5185f19tifpfr8s/AAB8cj0-niTFGbfGtEvjmfdGa?dl=0

提前感谢开发人员的任何建议或帮助。

【问题讨论】:

这听起来像是在应用转置对吧? 是的,这就是我需要的。 【参考方案1】:

这是一个非常基本的示例,但它应该可以胜任。注意使用正确的分隔符。您可以修改打印语句以获得正确的格式。

CSV: CSV 代表逗号分隔值,但 CSV 文件中至少有三种可能的分隔符。工具和库可以使用分号、逗号或制表符作为分隔符。根据创建文件的分隔符,您必须确保在读取文件时使用相同的分隔符。 python中的csv库调用分隔符分隔符。 由于输入文件未发布,我无法知道其中使用了哪个分隔符。

import csv

D = list(csv.reader(open(r"pes5part.csv"), delimiter=";"))
for l in zip(*filter(lambda e: e[0].strip() in ["Eigenvalues", "D7", "D15"], D)):
    print "\t".join(l)

当然不需要逐步进行,但是这样我觉得更容易阅读。

在进一步研究您的问题和示例后,我认为问题在于虽然该文件具有 csv 扩展名,但它不是正确的 CSV。 所以试试这个:

import re

splitter = re.compile("\s+")
D = [splitter.split(a) for a in open(r"pes5part.csv").readlines()]
for l in zip(*filter(lambda e: e[0] in ["Eigenvalues", "D7", "D15"], D)):
    print "\t".join(l)

【讨论】:

感谢您的回复。您能否为我提供一些关于您的脚本的解释,尤其是在我的案例中的分隔符选项,因为我按照您发布的内容运行它并且没有发生任何事情。 @ManolisSemidalas,用普通的文本编辑器检查你的输入文件(即使记事本也可以),看看使用的是哪个分隔符,相应地调整分隔符参数 @ManolisSemidalas,抱歉,我无法从工作中访问保管箱 感谢您的帮助。我将您的脚本用于dropbox.com/s/frrtesgin43jp3p/NEW_pes.csv?dl=0 和dropbox.com/s/z4lsiniu8lgz9vy/pesFULL.csv?dl=0 这两个文件但是尽管脚本运行没有任何错误,但遗憾的是没有提供打印输出。如果您能提供一些额外的解释,我将不胜感激。【参考方案2】:

考虑使用 Python 强大的数据分析工具包pandas,您可以在其中毫不费力地transpose 行到列:

import pandas as pd

# IMPORT DATA FRAME FROM CSV (ASSUMING NO HEADER)
chemistryData = pd.read_csv("C:\\Path\\To\\pes5part.csv",
                            header=None, names=['Type', '1', '2', '3', '4', '5'])

# FILTER NEEDED ROWS AND CONCATENATE TO NEW DATA FRAME
chemistryFilteredData = pd.concat([chemistryData[chemistryData['Type']=='Eigenvalues'],
                                   chemistryData[chemistryData['Type']=='D7'],
                                   chemistryData[chemistryData['Type']=='D15']], axis=0)

# TRANSPOSE DATA FRAME
chemistryTransposedData = chemistryFilteredData.transpose()

# OUTPUT NEW DATA FRAME TO CSV
chemistryTransposedData.to_csv("C:\\Path\\To\\tranposedfile.csv",
                               header=False)

print(chemistryTransposedData)

输出如下:

Type  Eigenvalues        D7       D15
1       -570.0893  326.3507  180.3134
2       -570.0882  316.3507  180.3134
3       -570.0868  306.3507  180.3134
4       -570.0852  296.3507  180.3134
5       -570.0838  286.3507  180.3134

【讨论】:

您的脚本适用于从原始 .txt 高斯输出修改为 .csv 的 NEW_pes.csv。可以在此处下载:dropbox.com/s/frrtesgin43jp3p/NEW_pes.csv?dl=0 但是,我需要对每 5 个构象器执行相同的过程,直到达到最后一个,例如可以在此处下载的高斯输出文件中的 361:dropbox.com/s/z4lsiniu8lgz9vy/pesFULL.csv?dl=0 我会如果您能解释# FILTER NEEDED ROWS AND CONCATENATE TO NEW DATA FRAME 或者是否应该使用循环过程,将不胜感激。

以上是关于如何用python将行排列成csv文件的列?的主要内容,如果未能解决你的问题,请参考以下文章

如何用python将九九乘法表写入csv文件中?

请问,如何用js控制输出csv文件?

如何用python读写CSV 格式文件

如何用python写 数据分析工具

如何用python改写csv的行高和列宽

如何用python读取csv文件,并把csv文件的第3,4列形成一个列表在python 中显示。如图中的两列数据