如何在函数中将列表转换为数组 - python?

时间:2013-10-14 11:43:49

标签: python arrays file-io numpy

我定义了一个函数(过程)来读取文件。我希望它返回包含我想从文件中读取的数据的数组,如下所示:

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,Tpv,Tav仍然是名单。

3 个答案:

答案 0 :(得分:3)

该行

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

从列表Ta的内容创建 new 数组对象,然后将此数组分配给本地标识符Ta。它确实更改引用列表的全局。

Python没有“变量”。它有标识符。在执行a = b时,您只需说“将名称a绑定到绑定到b的对象”。 a只是一个可用于检索对象的标签。如果您执行a = 0,则会重新绑定标签a,但会影响绑定到b的对象。标识符内存位置。

要将结果数组传递出函数,您可以:

  • 返回并重新分配全局Ta
  • 直接分配给全局变量。但是,为了执行此操作,应为本地Ta指定一个新名称​​和,您必须使用global语句(注意:避免这个解决方案。)

答案 1 :(得分:1)

也许你可以这样做:

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

答案 2 :(得分: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)