通过for循环附加到空列表但我的列表打印出空

时间:2017-06-28 14:29:47

标签: python list for-loop append iteration

我编写了一个函数,其目的是打开,读取,访问指定目录中每个文件中的数据值,并迭代地将每个文件数据条目附加到空列表中,然后将用于构建汇总csv文件。

问题是我的列表在for循环终止时为空。 我如何解决这个问题?

我已经尝试查看现有问题并且没有发现它有用。

这是我的代码:

fileid   = [] * len(os.listdir(path))   
objname  = [] * len(os.listdir(path))
obsvtype = [] * len(os.listdir(path))
filtr    = [] * len(os.listdir(path))



# Open, read, and iterate over files ending with the .fits extension in inputted path.
# Assign fits header key data to a variable and then append iteratively to respective empty list.

for fitsfile in os.listdir(path):
    if fitsfile[-5:] == '.fits':
        try:
            hdulist     = fits.open(str.format(fitsfile))

            filename    = hdulist[0].data['FILENAME']
            fileid.append(filename)


            object_name = hdulist[0].data['OBJECT']
            objname.append(object_name)

            obsvtyp     = hdulist[0].data['OBSTYPE']
            obsvtype.append(obsvtyp)

            filt        = hdulist[0].data['FILTERS']
            filtr.append(filt)
        except:
            pass

print(fileid,objname,obsvtype,filtr)


# Create an empty pandas dataframe object (data table) and assign populated data lists to dataframe.
# columns.

dataframe = pd.DataFrame(data = None)
dataframe['Filename']         = fileid     
dataframe['Object_Name']      = objname    
dataframe['Observation_type'] = obsvtype   
dataframe['Filter']           = filtr      

print(dataframe)

# Export compiled dataframe object to a .csv file in specified directory path.

dataframe.to_csv(path + 'reduc_tbl_result.csv',columns = ['Filename','Object_name',
    'Observation_Type','Filter'],index = None)

结果:

([],[],[],[]) 空DataFrame 列:[Filename,Object_Name,observation_type,Filter] 索引:[])

提前致谢。

3 个答案:

答案 0 :(得分:0)

在回答原始问题时,您需要初始化列表。附加失败,但错误被try块捕获。

fileid = []

如果你有很多文件,那么追加效率不是很高,因为每个追加必须完全复制数组。最好提前初始化列表。

fileid = [None] * len(os.listdir(path))

for i, fitsfile in enumerate(os.listdir(path)):
  fileid[i] = ...

您可能还希望使用glob模块列出具有给定扩展名的目录中的所有文件,有关示例,请参阅here

答案 1 :(得分:0)

以下基本代码可用于将文件附加到列表中:

import os
file_list = []
for f in os.listdir(os.getcwd()):
    file_list.append(f)
print(file_list)

对于您的代码,您希望使用提供的路径而不是当前的工作目录。

尝试更简单的方法(即,不处理适合文件),看看它是否有效并且复杂性增加。您的错误可能不会附加到列表中,而是使用fit或pandas Dataframe。

答案 2 :(得分:0)

我已经为那些将来需要解决方案的人认识到我的问题的根源。我上面的代码是打印空列表,因为fits.open()调用没有通过以下代码对os.listdir(path)的字符串元素进行操作:

    for fitsfile in os.listdir(path):
        if fitsfile[-5:] == '.fits':
           try:
               hdulist     = fits.open(str.format(fitsfile))  

我试过这个并且它有所不同:

    for fitsfile in os.listdir(path):
        if fitsfile[-5:] == '.fits':
            with fits.open(os.path.join(path,fitsfile)) as hdulist:
                try:  
                   hdu = hdulist[0]