如何将CSV文件中的行存储到Python并用HTML打印数据
基本上,我的问题是这样的:我有一个包含《南方公园》角色信息的CSV文件,还有一个HTML模板。我需要做的是逐行提取每个角色的数据(这些数据存储在列表中),然后用给定的HTML模板把这些数据放进去,创建5个不同的HTML页面,每个页面用角色的姓氏命名。
这是CSV文件的图片:i.imgur.com/rcIPW.png
这是我目前的进展:
askfile = raw_input("What is the filename?")
southpark = []
filename = open(askfile, 'rU')
for row in filename:
print row[0:105]
filename.close()
上面的代码在IDLE界面上打印出了所有信息,分成五行,但我需要找到一种方法来分离每一行和每一列,并把它们存储到一个列表中(我不知道该怎么做)。我知道这段代码很基础,我正在尝试找出先存储行和列的方法,然后我需要用一个函数(def)把数据分配给HTML模板,然后从这些数据/模板创建一个HTML文件……我现在还是个新手,试着在网上搜索,但我就是不太理解这些内容。
我不能使用任何可下载的模块,但我可以使用Python内置的东西,比如import csv等等,实际上这段代码应该是用几个函数、列表、字符串和循环来写的……
一旦我弄清楚如何分离行和列并存储它们,我就可以开始把数据放入HTML模板中,并创建文件。
我并不是想让别人帮我做作业,只是我编程水平不太好,所以任何帮助都很感激!
顺便说一下,我使用的是Python 2.7.2,如果你想下载CSV文件,可以点击这里。
更新:
好的,非常感谢!这让我更明白每一行打印的内容,以及程序读取了哪些信息。现在因为我必须在这个程序中使用函数,所以我在想这个。
每一行(0-6)打印出不同的值,但“打印行”函数只打印出一个角色和他所有对应的值,这正是我需要的。我想要的是像“打印行”那样打印数据,但我必须把这5个角色分别存储在不同的列表中。
基本上,“打印行”会打印出所有5个角色及其对应的属性,我该如何把每个角色分成5个变量,并把它们存储为一个列表呢?
当我执行print row[0]时,它只打印出名字,或者print row1只打印出生日期。我在想创建一个def函数,只取“打印行”,然后在一个循环中分成5个变量,接着另一个def函数把这些变量/数据列表和HTML模板结合起来,最后我还得弄清楚如何在Python中创建HTML文件……
抱歉如果我说得让人困惑,我只是想理清思路。这是我现在的代码,它给了我一个错误,提示值太多无法解包,但我只是想试试不同的东西,看看能否成功。根据我想做的事情,我可能得删除大部分代码,找个方法用列表类型的函数,比如.append或.strip等来重写,但我对这些不太熟悉……
import csv
original = file('southpark.csv', 'rU')
reader = csv.reader(original)
# List of Data
name, dob, descript, phrase, personality, character, apparel = []
count = 0
def southparkinfo():
for row in reader:
count += 1
if count == 0:
row[0] = name
print row[0] # Name (ex. Stan Marsh)
print "----------------"
elif count == 1:
row[1] = dob
print row[1] # DOB
print "----------------"
elif count == 2:
row[2] = descript
print row[2] # Descriptive saying (ex. Respect My Authoritah!)
print "----------------"
elif count == 3:
row[3] = phrase
print row[3] # Catch Phrase (ex. Mooom!)
print "----------------"
elif count == 4:
row[4] = personality
print row[4] # Personality (ex. Jewish)
print "----------------"
elif count == 5:
row[5] = character
print row[5] # Characteristic (ex. Politically incorrect)
print "----------------"
elif count == 6:
row[6] = apparel
print row[6] # Apparel (ex. red gloves)
return
reader.close()
1 个回答
首先,先看看这个CSV文档。
当你了解了基本知识后,可以看看这段代码。这会帮助你走上正确的道路:
import csv
original = file('southpark.csv', 'rU')
reader = csv.reader(original)
for row in reader:
#will print each row by itself (all columns from names up to what they wear)
print row
print "-----------------"
#will print first column (character names only)
print row[0]
你需要使用import csv
模块,这样才能处理CSV文件。打开文件时要用通用换行模式,然后用csv.reader来读取它。接着,你可以用for
循环来逐行读取数据,具体取决于你想要什么。第一个print row
会打印出某个角色的所有数据(比如:从名字到衣服类型的所有信息),像这样:
['Stan Marsh', 'DOB: October 19th', 'Dude!', 'Aww #$%^!', 'Star Quarterback', 'Wendy', 'red gloves']
-----------------
['Kyle Broflovski', 'DOB: May 26th', 'Kick the baby!', 'You ***!', 'Jewish', 'Canadian', 'Ushanka']
-----------------
['Eric Theodore Cartman', 'DOB: July 1', 'Respect My Authroitah!', 'Mooom!', 'Big-boned', 'Political
ly incorrect', 'Knit-cap!']
-----------------
['Kenny McCormick', 'DOB: March 22', 'DOD: Every other week', 'Mmff Mmff', 'MMMFFF!!!', 'Mysterion!'
, 'Orange Parka']
-----------------
['Leopold Butters Stotch', 'DOB:Younger than the others!', 'The 4th friend', 'Professor chaos', 'stu
tter', 'innocent', 'nerdy']
-----------------
最后,第二个语句print row[0]
只会给你角色的名字。你可以更改这个数字,就能获取其他的数据。记住,在CSV文件中,所有的索引都是从0开始的,所以在你的例子中,你最多只能到6,因为A=0, B=1, C=2, 等等...
为了更清楚地看到这些输出,最好注释掉其中一个print
语句,这样你就能更清楚地了解你获取了什么。
-----------------
Stan Marsh
-----------------
Kyle Broflovski
-----------------
Eric Theodore Cartman
-----------------
Kenny McCormick
-----------------
Leopold Butters Stotch
注意 我加了print "-----------------"
,这样你就能看到不同的输出。希望这能帮助你入门。
编辑 为了回答你的第二个问题:获取某个角色所有信息的最简单方法(虽然可能不是最好的方法)是这样做:
import csv
original = file('southpark.csv', 'rU')
reader = csv.reader(original)
stan = reader.next()
kyle = reader.next()
eric = reader.next()
kenny = reader.next()
butters = reader.next()
print eric
这将输出:
['Eric Theodore Cartman', 'DOB: July 1', 'Respect My Authroitah!', 'Mooom!', 'Big-boned', 'Politically incorrect', 'Knit-cap!']
请注意,如果你的CSV文件被修改,比如角色的顺序被改变(例如:butters被移动到顶部),你将输出另一个角色的信息。