2013-03-20 2 views
0

Я использую этот скрипт с большим успехом, но мне было любопытно, как он ссылается на данные. (Как еще я научиться?)Как этот скрипт python видит правильный столбец?

input_file = Cars.csv  
with open(input_file) as f: 
    reader = csv.reader(f) 
    next(reader) 
    cars_list = tuple([row[1] for row in reader]) 

template_cars ="C:\\Data\\CarsTemplate.txt" 
cars_textfile = "C:\\Data\\Cars.txt" 
shutil.copyfile(template_cars,cars_textfile) 

with open(cars_textfile, 'a') as f: 
    if len(cars_list) == 0: 
     cars_Sentence = "" 

    elif len(cars_list) == 1: 
     cars_Sentence = "A %s is parked on the street." % cars_list 

    elif len(cars_list) == 2: 
     cars_Sentence = "Cars %s and %s are parked on the street." % cars_list 

    else: 
     for record in cars_list: 
      cars_Sentence = "Cars " + ('%s, ' * (len(cars_list)-1) + 'and %s') % tuple(cars_list) + " are parked on the street" 

    f.write(cars_Sentence) 
f.close() 

данные моего Cars.csv файла:

RecNo,Model,ItemNo,Count 
1,Prius,1,1 
2,Civic,2,3 
3,Lexus,1,5 
4,Jetta,5,1 
5,Subaru,0,0 

Учитывая выше код, который работает для моих данных, как он знает, чтобы распечатать модель колонке, а не в других колонах? Я полагаю, что это имеет какое-то отношение к столбцу, содержащему строки, а не числа.

Если мои данные имели два столбца строк вместо одного, как бы я просто ссылался на нужный столбец и выводил те же результаты? Просто любопытно. Попытаться задуматься над кодированием.

Опять же, благодаря всем, что помогает мне.

ответ

1

Как можно часто можно улучшить код, чтобы стать более надежным и читаемым , прочитав документацию (здесь: модуль csv) и правильно выбрав.

Обратите внимание, что в вашем файле CSV первая строка указывает имена полей; он пропускается по следующему (читателю) вызову .

Chosing оптимального класса, который вы не должны пропустить его, но оцениваются, чтобы получить доступ к этим именам полей и первый раздел становится:

with open(input_file) as f: 
    reader = csv.DictReader(f) 
    cars_list = tuple([row["Model"] for row in reader]) 

Это делает совершенно очевидным, где изменить, чтобы получить различную информацию а также будет работать для файлов, где столбец «Модель» по-разному размещен.

+0

Удивительный! Я меняю его сейчас. Это действительно поможет в моих ошибках памяти. – user12059

1

только столбец модели взят из файла:

cars_list = tuple([row[1] for row in reader]) 

Это берет каждую строку из вашего входа (который модуль CSV превращается в последовательность столбцов) и принимает только второй столбец (питон использует 0 основанный на индексации).

Другими словами, каждый, кто написал этот код, знал, что каждая строка входного файла содержит четыре столбца и выбирает только вторую. Если в другой колонке содержится модель, вам придется настроить индекс row[1].

+0

Ha. Я на это ссылался сам, но забыл, почему. Gettin старый трудно иногда .... Спасибо. – user12059

Смежные вопросы