CSV文本在Python

时间:2017-04-23 11:18:04

标签: python csv web-scraping

感谢阅读!我对此很新,但昨天我开始从网站中提取数据(项目名称及其相应的价格),并指出如何使用Python 2.7格式创建csv文件:price,item-name。现在我有一些数据集,我想比较它们并获得给定项目名称的平均价格。我现在遇到的问题是每个网站上的项目名称(可能)略有不同。例如,我的第一个数据集给出了csv文件

4.0, Jungle Book
5.0, "Peter Pan"
4.0, Lady and the Tramp

第二个给出

5.0, Disney's Jungle Book
6.0, Disney's Up
4.0, Disney's Peter Pan

第三个给出了

5.0, Up (DVD)
4.0, Peter pan (DVD)
6.0, "Lady and the Tramp" (DVD)

最后我想要一个像

这样的平均输出文件
4.5, Jungle Book
5.0, Lady and the Tramp
4.33, Peter Pan
5.5, Up

我的第一个问题是删除"等特殊字符。或我的csv文件中的某些单词(例如"迪士尼","(DVD)")。我找到有关从csv文件中删除行和列的信息,但我很难在这些元素中进行编辑。这样的东西可以删除'(DVD)'有点工作,但让我的csv文件更加混乱更多"和[字符..

import csv
import string

input_file = open('DesktopData.csv', 'r')
output_file = open('fixformat.csv', 'w')
data = csv.reader(input_file)
writer = csv.writer(output_file,quoting=csv.QUOTE_ALL)# dialect='excel')
specials = '(DVD)'

for line in data:
    line = str(line)
    new_line = str.replace(line,specials,'')
    writer.writerow(new_line.split(','))

input_file.close()
output_file.close()

一旦确定,我想取一个给定标题的平均价格。我有一些想法,但缺乏python语法来真正弄明白

Read all titles and put in mainlist;
 if title already exsists, ignore/dont make new row with title
Read all files and compare with mainlist;
 if title is found, put corresponding price in new column behind title

在我的头脑中,这必须输出

Jungle Book, 4.0, 5.0
Lady and the Tramp, 4.0, 6.0
Peter Pan, 5.0, 4.0, 4.0
Up, 6.0, 5.0

一旦我得到这个,我很确定我可以把它变成普通的csv文件。任何建议都非常感谢!

1 个答案:

答案 0 :(得分:0)

到目前为止,最难的部分是找到相同的名称,相差很小的区别。在这里的解决方案中,我创建了一个简单的normalize_title函数,但它远非完美。我想它需要为每个新数据集手动调整和扩展。但是,从中可以看出,这是一个解决您问题的方法,它从几个csv文件中收集数据,然后将平均成本与电影标题一起存储在新的csv文件中:

import csv

filenames = ['first.csv', 'second.csv', 'third.csv']
outfile = 'avg.csv'

removables = ['[', ']', '"', "'", "Disney's", '(DVD)']
def nomalize_title(title):
    for remove in removables:
        title = title.replace(remove, '')
    title = title.lower() # Correct capitalization is HARD
    return title

moviecosts = dict()
for filename in filenames:
    with open(filename, 'rb') as f:
        reader = csv.reader(f)
        for row in reader:
            raw_title = row[1]
            title = normalize_title(raw_title)
            price = float(row[0])

            if not moviecosts.has_key(title):
                moviecosts[title] = []

            moviecosts[title].append(price)

with open(outfile, 'wb') as f:
    writer = csv.writer(f)
    for movie in moviecosts:
        avg_cost = sum(moviecosts[movie])/len(moviecosts[movie])
        row = [avg_cost, movie]
        writer.writerow(row)

可以看出,我将不同的成本存储在列表字典中。对我来说,这似乎是解决当前问题的最自然的数据结构。