2015-03-26 2 views
2

Я новичок в python и хотел бы получить помощь.с использованием python для рандомизации файла csv

У меня есть CSV-файл с 2 колонками, думаю:

1 A

2 B

3 C

4 D

Моя цель состоит в том, чтобы использовать питона «открыть» файл, прочитать его, рандомизировать порядок двух списков (т. е. иметь 1 с той же строкой, что и C, 2 с D и т. д.), а затем сохранить новые рандомизированные списки в другом файле csv.

Спасибо,

Edit:

import csv 
 
import random 
 
f=open('my_file.csv') 
 
csv_f=csv.reader(f)

Я прочитал еще некоторый материал о писателе. но не знаете, как использовать эти функции.

Редактировать 2: кто-то просто написал отличный комментарий, но по какой-то причине я не могу его увидеть сейчас. единственная проблема заключается в том, что мне нужно сохранить заголовки столбцов неповрежденными, они не могут быть рандомизированы. Код следующим образом:

import csv 
 
import random 
 

 
with open ("my_file") as f: 
 
    l=list(csv.rader(ff)) 
 

 
random.shuffle(l) 
 

 
with open("random.csv", "W") as f: 
 
    csv.writer(f).writerows(f)

+2

Вы уже сломана проблему вниз красиво на отдельные шаги. Попробуйте перевести каждый шаг на код, и если вы застряли на конкретном, покажите нам код, который у вас есть, и объясните, где именно вы застряли. – Marius

+0

Взгляните на две ссылки: https://docs.python.org/2/library/functions.html#open, http://stackoverflow.com/questions/976882/shuffling-a-list-of-objects -in-python – dgsleeps

+0

Ну, я нашел код, который использовал кто-то еще и попытался настроить его на мои нужды, но он не прошел очень хорошо. Теперь я пытаюсь сделать это самостоятельно, и все, что я придумал до сих пор, это (отредактирует мой вопрос выше) – HBS

ответ

2

Вы можете прочитать строки как список, извлечь две колонки, затем перетасовать каждый из них, а затем сжать столбцы вместе и, наконец, записать результат в новый csv файл:

import csv 
import random 

with open("input.csv") as f: 
    r = csv.reader(f) 
    header, l = next(r), list(r) 

a = [x[0] for x in l] 
random.shuffle(a) 

b = [x[1] for x in l] 
random.shuffle(b) 

with open("random.csv", "wb") as f: 
    csv.writer(f).writerows([header] + zip(a, b)) 
+0

Я не думаю, что это делает то, о чем спрашивает OP, они хотят случайно соединить элементы, а не просто перетасовывать порядок строк. – Marius

+0

Да, спасибо за разъяснение – JuniorCompressor

+0

просто из любопытства, что такое * практическая * разница в python между перетасовкой и рандомизацией? – HBS

0

HBS, проблема с вашим кодом в том, что он пытается перетасовать порядок строк, а не столбцы отдельно.

Вы можете прочитать каждый столбец в отдельных списках, а затем применить перетасовку, а затем объединить два списка вместе, чтобы сформировать список строк, прежде чем записывать их в выходной файл.

Чтобы сохранить заголовки после того, как вы прочитали входной файл, вытащите первый элемент из результирующего списка и затем перекомбинируйте после перетасовки.

Вот код для иллюстрации действия:

import random 
import csv 

# read the data into lists 
with open('input.csv', 'r') as myfile: 
    csvreader = csv.reader(myfile, delimiter=' ') 
    list1 = [] 
    list2 = [] 
    for row in csvreader: 
     a, b = row 
     list1.append(a) 
     list2.append(b) 

# pop the first element (headers) 
title1, title2 = list1.pop(0), list2.pop(0) 

# shuffle the list 
random.shuffle(list1) 
random.shuffle(list2) 

# add the titles back: 
list1 = [title1] + list1 
list2 = [title2] + list2 

# write rows to output file 
with open('output.csv', 'w') as oput: 
    output_rows = list(zip(list1, list2)) 
    csvwriter = csv.writer(oput, delimiter=' ') 
    csvwriter.writerows(output_rows) 
0

Может не использовать csv модуль. Как насчет

Создайте два пустых списка, один для хранения цифр и один для хранения букв.

Откройте файл,

Для каждой строки в файле

Разделить линии

Добавить номер в список номеров

Добавить письмо в список писем


Перемешать список номеров

Возьмите один элемент из каждого списка, в последовательности, и записать их в файл

Repeat

Встроенная функция zip должна помочь с этим последним битом.

0

Посмотрите на исходный код csvshuf:

reader = csv.reader(args.infile, delimiter=args.delimiter, quotechar=args.quotechar) 

"""Get the first row and use it as column headers""" 
headers = next(reader) 

"""Create a matrix of lists of columns""" 
table = [] 
for c in range(len(headers)): 
    table.append([]) 
for row in reader: 
    for c in range(len(headers)): 
     table[c].append(row[c]) 

cols = args.columns 

for c in cols: 
    args.shuffle(table[c - 1]) 

"""Transpose the matrix""" 
table = zip(*table) 

writer = csv.writer(sys.stdout, delimiter=args.output_delimiter) 
writer.writerow(headers) 
for row in table: 
    writer.writerow(row) 
Смежные вопросы