2017-04-18 209 views
-2

我需要从csv文件中选择一个随机单词,我只是不知道如何开始它。所有的单词都在一列中,但我想要得到一个随机行,以便输出一个随机单词。有什么想法吗?使用python,你如何选择一个csv文件的随机行?

+3

使用[**'random' **]( https://docs.python.org/2/library/random.html)和[**'csv' **](https://docs.python.org/2/library/csv.html)模块。 –

+0

我会统计行数。从这个随机整数可以在1到行数的范围内生成。 完成此操作后,只需在该行读取关闭的单词? – CodeCupboard

+1

如果文件太大而无法一次读入内存,则可以使用[resevoir sampling](http://stackoverflow.com/questions/9690009/pick-n-items-at-random-from-sequence-of -Unknown长度)。 –

回答

2

你可以使用熊猫:

import pandas as pd 
csvfile = pd.read_csv('/your/file/path/here') 
print csvfile.sample() 
0

既然你说,所有的话都在一列,这使得它更容易解析该文件。这里是我的解决方案:

import random 

with open('random_word_from_file.txt') as f: 
    words = f.read().split() 
    my_pick = random.choice(words) 
    print my_pick 

  • 在这个解决方案,我认为该文件的大小在内存
  • 我用f.read().split()代替f.readlines()因为以后不会删除新的合理配合线字符脱字
  • 一旦有了一个单词列表,就叫random.choice()随机挑一个
2

使用randomcsv模块。

如果您csv文件足够小,以适应到内存中,你可以阅读整个事情,然后选择线路:

import csv 
import random 

with open(filename) as f: 
    reader = csv.reader(f) 
    chosen_row = random.choice(list(reader)) 

你必须在整个文件在读取一次,因为choice需要知道如何有很多行。

如果你感到快乐制出一个以上传过来的数据,你可以指望的行,然后选择一个随机行和文件中再次达到该行写着:

with open(filename) as f: 
    lines = sum(1 for line in f) 
    line_number = random.randrange(lines) 

with open(filename) as f: 
    reader = csv.reader(f) 
    chosen_row = next(row for row_number, row in enumerate(reader) 
         if row_number == line_number) 

如果你想增量和随机选择一行,但不知道有多少行,您可以使用reservoir sampling。这可能会比较慢,因为它会进行多个随机选择,直到它耗尽行,但一次只需要一行内存:

with open(filename) as f: 
    reader = csv.reader(f) 
    for index, row in enumerate(reader): 
     if index == 0: 
      chosen_row = row 
     else: 
      r = random.randint(0, index) 
      if r == 0: 
       chosen_row = row 
+1

很好的方法来计算文件中的行数。 –