2016-12-03 88 views
0

這似乎應該是python中最基本的東西,它應該幾乎是一個默認選項。我有一個文本文件,有行如如何從文件中讀取python數據類型

123, [12, 23, 45, 67] 

第二個數組的長度是可變的。我如何閱讀此內容?無論出於何種原因,我無法找到關於如何處理'['或']'的單一文檔,哪一個人可能認爲是python中最基本的一個字符。

np.loadtxt是一個半身像,顯然這只是最簡單的文件格式

np.genfromtxt是一個半身像,由於缺少列。順便說一句,我想相信這裏的missing_value功能可能會有所幫助。瞭解missing_value事件實際上做了什麼(如果有的話)會很有用(在文檔中根本沒有解釋清楚)。

我想這給了我

['123', '[12', '23', '45', '67]'] 

大概我可以通過項目分析該項目應對「[」和「]」,但在這個階段,我剛纔做了我自己的np.fromstring路線python文件閱讀器讀取相當基本的python結構!

至於期望的產出,在這個階段,我會解決幾乎任何事情。明顯的構建體將是一行的形式

[123, [12, 23, 45, 67]] 
+2

*「我無法找到關於如何處理'['或']'的文檔,哪一個人可能會認爲是python中最基本的一個字符。」*這可能是因爲將它們以這種形式包含在文本文件中是不常見的。更普通的是普通的CSV(逗號分隔值,沒有括號)。另一個極端,對於不同的數據類型有很多不同的分隔符,是[JSON](http://www.json.org/)及其親屬。如果您可以控制文件格式的設計,我建議簡化爲簡單的CSV(不帶括號),或者使用完整的JSON。 –

回答

2

loadtxt和線genfromtxt解析線,從一個簡單的split

In [360]: '123, [12, 23, 45, 67]'.split(',') 
Out[360]: ['123', ' [12', ' 23', ' 45', ' 67]'] 

然後他們嘗試轉換單個字符串。一些很容易轉換爲整數或浮點數。與[]不一樣。處理這些並不是微不足道的。

Python自帶的csv閱讀器可以處理帶引號的文本,例如:

`one, "twenty, three", four' 

我還沒有與它足夠的出場知道它是否可以治療[]爲引號或沒有。

你的括號中的文字是比較容易,如果你用括號內不同的分隔符來解析,例如

In [371]: l1='123; [12, 23, 45, 67]'.split(';') 
In [372]: l1 
Out[372]: ['123', ' [12, 23, 45, 67]'] 
In [373]: l2=l1[1].strip().strip(']').strip('[').split(',') 
In [374]: l2 
Out[374]: ['12', ' 23', ' 45', ' 67'] 

沃倫評論,平原CSV東西的行業標準,並在許多語言中使用。括號等的使用尚未標準化。但是有XML,JSON和yaml等數據交換語言,以及非文本數據文件(例如HD5F)。

JSON例如:

In [377]: json.loads('[123, [12, 23, 45, 67]]') 
Out[377]: [123, [12, 23, 45, 67]] 
1

默認選項爲eval。它可以讓你評估字符串中的Python表達式。儘管如此,這是一個安全隱患,參見例如this question。但ast.literal_eval應該沒問題。例如:

from ast import literal_eval 

with open("name of file") as fh: 
    data = [literal_eval(line) for line in fh]