如何使用python将行排列到csv文件的列中?
我是一名化学系学生,对分子构象分析感兴趣。为了找到最稳定的构象,我对异丙酸进行了势能表面扫描。通过这个简单的过程,由于原子群围绕一个键旋转而产生的不同空间排列被可视化。分子的图像pes_molecule.png清楚地显示了链的两个不同二面体 用于此目的的程序称为Gaussian 09,并为前五个符合项提供以下pes5part.csv输出:如何使用python将行排列到csv文件的列中?,python,csv,dynamic,opensuse,Python,Csv,Dynamic,Opensuse,我是一名化学系学生,对分子构象分析感兴趣。为了找到最稳定的构象,我对异丙酸进行了势能表面扫描。通过这个简单的过程,由于原子群围绕一个键旋转而产生的不同空间排列被可视化。分子的图像pes_molecule.png清楚地显示了链的两个不同二面体 用于此目的的程序称为Gaussian 09,并为前五个符合项提供以下pes5part.csv输出: 1 2 3 4 5 Eigenvalues -- -
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的值,如上面的**我的目标csv文件**所示
Gaussian和所有361符合项的完整PES扫描文件输出为pesFULL.csv:键入5小时后,手动创建的所有361个符合项的最终完整所需PES文件为PES.ods
而最终的PES图在文件PES_-graph1.png和PES_-graph2.png 我已将上述所有文件附加到共享dropbox文件夹中
提前感谢开发人员提供的任何建议或帮助。这是一个非常基本的示例,但它应该可以完成这项工作。注意使用正确的分隔符。您可以修改print语句以获得正确的格式 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)
考虑使用Python强大的数据分析工具包,您可以轻松地从行到列:
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
这听起来像是在应用转置,对吗?是的,这就是我需要的。谢谢你的回复。你能给我解释一下你的脚本,特别是我的例子中的delimeter选项吗?因为我在你发帖时运行它,但什么也没有发生。@Manolissimidalas,用普通的文本编辑器检查你的输入文件(即使记事本也可以工作),看看使用了哪个分隔符,调整delimiter参数accordingly@ManolisSemidalas,很抱歉,我无法从Work访问dropbox。非常感谢您的帮助。我对这两个文件都使用了您的脚本,但是尽管脚本运行时没有任何错误,但遗憾的是没有提供打印输出。如果您能提供一些额外的解释,我将不胜感激。您的脚本适用于新的_pes.csv,它从原始的.txt高斯输出修改为.csv。可以在这里下载:但是,我需要对每5个合格者执行相同的程序,直到我达到最后一个,例如,可以在此处下载的Gaussian输出文件中的361:如果您能够解释#过滤所需行并连接到新数据帧,或者是否应该使用循环过程,我将不胜感激。