从CSV文件读取数据并添加到字典或元组中
我刚开始学习Python,想重写我的股票筛选程序,需要一些帮助来入门。
第一个模块是一个创建主数据的程序。它会读取一个CSV格式的股票数据文件,这个文件是每天结束时的数据。
接着,它会解析这个主文件,把当天的股票信息添加到一个包含35个元素的数组里。
每个数组有5列,用来存放每天结束时的信息。
原来的程序是根据股票名称来索引的,但对于主文件来说,索引并不重要,因为在第二个主要的股票程序中,主文件是按顺序访问的。我们需要的是把股票名称用作主文件中记录的标题。
我们需要一种方法来打开和读取CSV文件。通过比较每个股票名称 if stka == stkb
来更新 main.idx
中的信息。
伪代码:
Open-r CVS
Open-rwb main
While (cvs)
Readline(CVS)
Readline (main)
If cvs == main
Add to record
Wright (main)
else
If cvs > main
Readline (main)
else
If cvs < main
Readline (cvs)
这里有一些处理CSV程序的代码和我的尝试,可以在 自动更新CSV文件 找到。
我的需求比较简单,我只需要读取CSV文件。主文件可以是任何Python的数据集,比如 list
、dictionary
或 tuple
。
谢谢你们的帮助,希望能给我指个方向。
1 个回答
你对使用的文件格式和读取后需要做什么并没有说得很清楚。不过根据你在另一个关于读取CSV文件的问题中提到的一些文件格式,我给你一个示例程序,供你参考。
这里有一个主文件 m.csv.txt
。这是一个逗号分隔值(CSV)文件,第一列是一个标识符。
AAC,D,20111207,9.83,9.83,9.83,9.83,100
AACC,D,20111207,3.46,3.47,3.4,3.4,13400
AACOW,D,20111207,0.3,0.3,0.3,0.3,500
AAME,D,20111207,1.99,1.99,1.95,1.99,8600
AAON,D,20111207,21.62,21.9,21.32,21.49,93200
AAPL,D,20111207,389.93,390.94,386.76,389.09,10892800
这是一个每日更新文件 d.csv.txt
。它的格式和主文件一样,第一列也是标识符。如果这个标识符和主文件中的某个标识符相同,那么这些条目就应该合并在一起。否则,来自每日文件的新标识符会被添加到总列表中。
AACC,D,20120127,4.01,4.02,4.03,4.04,40000
B,D,20120127,4.01,4.02,4.03,4.04,40000
这里有一个简单的程序,用来读取主文件,使用csv
模块,并把每一行的条目放到一个字典 stocks
里。第一列用作字典的键。这是一个非常简单的数据结构,但你说主文件可以是任何数据格式。然后我们打印出 stocks
字典。
import csv
mainReader = csv.DictReader( open("m.csv.txt","rb"), ["id"],"others")
newReader = csv.DictReader( open("d.csv.txt","rb"), ["id"],"others")
stocks = {}
for line in mainReader:
stocks[line['id']] = line
print stocks # output hand-formatted
{
'AAC': {'id':'AAC',
'others': ['D','20111207','9.83','9.83','9.83','9.83','100']},
'AACC': {'id':'AACC',
'others': ['D', '20111207', '3.46', '3.47', '3.4', '3.4', '13400']},
'AAME': {'id': 'AAME',
'others': ['D', '20111207', '1.99', '1.99', '1.95', '1.99', '8600']},
'AACOW': {'id': 'AACOW',
'others': ['D', '20111207', '0.3', '0.3', '0.3', '0.3', '500']},
'AAPL': {'id': 'AAPL', 'others':
['D','20111207','389.93','390.94','386.76','389.09','10892800']},
'AAON': {'id': 'AAON',
'others': ['D', '20111207', '21.62', '21.9', '21.32', '21.49', '93200']}
}
接下来程序会读取每日更新文件,依然使用csv模块。你没有明确说明如果条目的标识符相同,应该如何合并主文件中的条目。为了这个示例,我就让每日文件中的条目完全替代现有的条目。然后我们打印出更新后的 stocks
。
for line in newReader:
# can use if line['id'] in stocks: to check for an existing record if desired
# in this example, we blindly overwrite any existing entry
stocks[line['id']] = line
print stocks # output hand-formatted
{
'AAME': {'id': 'AAME',
'others': ['D', '20111207', '1.99', '1.99', '1.95', '1.99', '8600']},
'B': {'id': 'B',
'others': ['D', '20120127', '4.01', '4.02', '4.03', '4.04', '40000']},
'AACC': {'id': 'AACC',
'others': ['D', '20120127', '4.01', '4.02', '4.03', '4.04', '40000']},
'AAPL': {'id': 'AAPL',
'others': ['D','20111207','389.93','390.94','386.76','389.09','10892800']},
'AAON': {'id': 'AAON',
'others': ['D', '20111207', '21.62', '21.9', '21.32', '21.49', '93200']},
'AACOW': {'id': 'AACOW',
'others': ['D', '20111207', '0.3', '0.3', '0.3', '0.3', '500']}
}
注意,字典这种数据结构在打印时没有特定的顺序。如果你想要有序的输出,可以使用字典的 items()
方法获取一个列表,然后用 .sort()
来排序这个列表。(还有很多其他的方法可以做到这一点。)
s = stocks.items()
s.sort()
print s # output hand-formatted
[
'AACC': {'id': 'AACC',
'others': ['D', '20120127', '4.01', '4.02', '4.03', '4.04', '40000']},
'AACOW': {'id': 'AACOW',
'others': ['D', '20111207', '0.3', '0.3', '0.3', '0.3', '500']},
'AAME': {'id': 'AAME',
'others': ['D', '20111207', '1.99', '1.99', '1.95', '1.99', '8600']},
'AAON': {'id': 'AAON',
'others': ['D', '20111207', '21.62', '21.9', '21.32', '21.49', '93200']},
'AAPL': {'id': 'AAPL',
'others': ['D','20111207','389.93','390.94','386.76','389.09','10892800']},
'B': {'id': 'B',
'others': ['D', '20120127', '4.01', '4.02', '4.03', '4.04', '40000']}
]
你想要写出一个更新后的主文件吗?可以使用 csv.DictWriter()
或 csv.writer()
。你可以逐行写入,也可以一次性输出像 stocks
这样的完整内存列表。