2013-10-14 70 views
1

我定义了一个读取文件的函数(procedure)。我希望它返回一个数据数组我想从文件中读取,因为它遵循:如何将列表转换为函数中的数组 - python?

import csv 
import numpy as np 
import matplotlib.pyplot as plt 

# Subroutine to read the day, Ta,Tp from a file and convert them into arrays 
def readstr(fname,day,Ta,Tp): 
    van = open(fname,'r') 
    van_csv = van.readlines()[7:] # Skip seven lines 
    van.close()     # close the file 
    van_csv = csv.reader(van_csv) # now the file is separated by colunms 
    for row in van_csv: # Passing the values of the each column to arrays 
     day.append(row[1]) 
     Ta.append(row[8]) 
     Tp.append(row[7]) 
    day = np.array(day,dtype=np.integer) 
    Ta = np.array(Ta,dtype=np.float) 
    Tp = np.array(Tp,dtype=np.float) 
van = "file" 
# Defining the lists 
dayVan = [] 
Tav = [] 
Tpv = [] 

readstr(van,dayVan,Tav,Tpv) 
print Tav 

我认为这是可行的,但dayVan,冠捷,保持Tav的是列表。

+0

你是不是修改'钽度(Tav )'和'Tp(Tpv)'。你绑定了一个由'np.array'返回'Ta'和'Tp'的新实例。这意味着你正在用一个新的绑定替换'Tav'绑定,但是'Tav'仍然被绑定到一个空列表。 –

回答

3

线

Ta = np.array(Ta,dtype=np.float) 

创建从列表Ta的内容的新阵列对象时,它然后分配这个阵列到本地标识符Ta。它确实不是更改引用列表的全局。

Python没有“变量”。它有标识符。在做a = b时,你只需说“将名称a绑定到绑定到b的对象”。 a只是一个可以用来检索对象的标签。如果您然后做a = 0您重新绑定标签a但这是而不是影响绑定到b的对象。标识符是而不是内存位置。

要通过所产生的阵列出来的功能,您可以的:

  • 回报他们,并重新分配全球Ta
  • 直接分配给全局变量。不过,为了做到这一点,当地Ta应给予一个新的名字你必须使用global语句(注意:避免这个解决方案。)
+1

作为一个工作示例:http://ideone.com/sXKiAi –

+0

比你的解释。 –

+0

另请参阅其他答复,因为您可以看到一个非常有趣的阅读文件的简短方式以及如何执行第一个建议。 –

1

也许你可以简单地做:

dayVan, Tpv, Tav = np.loadtxt(fname, usecols=(1,7,8), skiprows=7, delimiter=',', unpack=True) 
+0

它不起作用,因为该文件相当复杂:前七行是“垃圾”(程序的输出),下一行格式良好(列以逗号分隔)。我试图跳过行,但它还没有工作。以下错误:“文件”/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py“,第827行,在loadtxt中 items = [conv(val)for(conv,val)in zip (转换器,vals)] ValueError:无效文字为float():2,“ –

+0

@Marcos这很有趣,也许你可以在外部链接提供你的文件的样本,我可以看看... –

+0

它如下文件:https://dl.dropboxusercontent.com/u/65512038/fname.dat –

1

的变换做得正确,但只有你的函数里面。

尝试在函数结束时返回Day,Ta和Tp,并从调用者获取它们,它会更好地工作。

def readstr(fname): 
    van = open(fname,'r') 
    van_csv = van.readlines()[7:] # Skip seven lines 
    van.close()     # close the file 
    van_csv = csv.reader(van_csv) # now the file is separated by colunms 
    day, Ta, Tp = [], [], [] 
    for row in van_csv: # Passing the values of the each column to arrays 
     day.append(row[1]) 
     Ta.append(row[8]) 
     Tp.append(row[7]) 
    day = np.array(day,dtype=np.integer) 
    Ta = np.array(Ta,dtype=np.float) 
    Tp = np.array(Tp,dtype=np.float) 
    return day, Ta, Tp 

dayVan, Tav, Tpv = readstr(van) 
+0

它完美的作品,因为它是由Bakuriu建议。感谢您以正确的格式重写我的脚本。 –