2017-01-10 75 views
0

我有一段代碼,以打開txt文件意甲是這樣的:避免因爲如果在Python

path_name = './path/to/my/file' 
file_name = 'initial_name_of_file' 

kms = np.arange(0,9,1) # kilometers 
ms = np.arange(0,1000,10) # meters 

for ik in kms: 
    for im in ms: 
     sing_fName = file_name+str(ik)+'+'+str(im)+'.txt' 
     with open(path.join(path_name, sing_fName).replace("\\","/")) as profile: 
      var_reader = csv.reader(profile, delimiter=',') 
      if ik==8 and im==410: 
       break 

在這一點上,我想代碼時停止IK = 8和IM = 410,即代碼應與IM去從0 RO 990而IK變爲0-7和停止IM 410如果IK = 8

我的問題是雙重的:

  1. 有沒有更有效生成單個文件名的方法 (sing_fN ame)並依次打開文件以訪問 數據?
  2. 如何跳過'for for if'嵌套?

謝謝!

+1

我沒有看到一個'if',但看看'itertools',它有一個'product'功能。 – glglgl

+0

你是對的:我編輯問題。 – brodegon

+0

如果你真的不喜歡2 forloop,你可以使用[itertools.product](https://docs.python.org/2/library/itertools.html#itertools.product)或列表理解像'for sing_fName in [「文件名%s +%s.txt」%(kms,ms),範圍爲(0,9,1)時爲kms,範圍爲(0,1000,10)]:' – CSJ

回答

0

我想補充一個出口標誌:

import numpy as np 

path_name = './path/to/my/file' 
file_name = 'initial_name_of_file' 

kms = np.arange(0,9,1) # kilometers 
ms = np.arange(0,1000,10) # meters 

exit = False 

for ik in kms: 
    if exit: 
     break 
    for im in ms: 
     if ik==8 and im==410: 
      exit = True 
      break 
     sing_fName = file_name+str(ik)+'+'+str(im)+'.txt' 
     with open(path.join(path_name, sing_fName).replace("\\","/")) as profile: 
      var_reader = csv.reader(profile, delimiter=',') 
+0

謝謝!它運行良好,速度非常快。 – brodegon

+0

我已經標記爲正確,因爲它稍微快一點,但Jean-FrançoisFabre的解決方案也可以很好地工作。 – brodegon

0

您的雙for循環沒有任何問題。

如果您希望代碼停止在索引8的410處,請動態定義您的索引,因此在內部循環中沒有索引測試,肯定會更快。

對於文件名,使用format更爲pythonic,可能也更快。您也可以在外部循環中預先計算前綴。

kms = np.arange(0,9,1) # kilometers 

for ik in kms: 
    prefix = "{}{}+".format(file_name,ik) 
    for im in np.arange(0,420 if ik == 8 else 1000,10): # dynamic upper bound 
     sing_fName = "{}{}.txt".format(prefix,im) 
     with open(path.join(path_name, sing_fName)) as profile: 

另:不要將反斜槓轉換成斜線。除了減慢你的代碼之外,這沒有任何作用。由於os.path.join使用反斜槓,這意味着系統可以處理它。

+0

感謝您的回答。一些意見/問題: 1.我不夠清楚,對不起:我需要從0到7的所有ik從0到990有一個im,ik = 8是唯一應該在im = 410 2.關於反斜槓,如果我保留它們,我應該將path_name更改爲'。\\ path \\到\\ my \\ file',對吧? – brodegon

+0

編輯,沒有'如果',只是在較低的循環動態上限。不,你可以使用斜槓來爲你的路徑,python/windows知道它們。或者使用原始前綴:'r「\ path \ to \ my \ file」',所以不需要加兩個反斜槓。 –