我编写了一个函数,其目的是打开,读取,访问指定目录中每个文件中的数据值,并迭代地将每个文件数据条目附加到空列表中,然后将用于构建汇总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] 索引:[])
提前致谢。
答案 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]