2016-12-15 15 views
0

Ошибка синтаксиса Python - ввод файла CSV: Я пытаюсь использовать тест маскировки CSV для реализации и взял пример использования с masking using faker. Выбрал пример кода из ссылки и попытался выполнить программу. Но я получаю синтаксическую ошибку при доступе к файлу csv.Python faker - Ошибка синтаксиса - CSV-файл

import unicodecsv as csv 
from faker import Factory 
from collections import defaultdict 



def anonymize_rows(rows): 
""" 
Rows is an iterable of dictionaries that contain name and 
email fields that need to be anonymized. 
""" 
# Load the faker and its providers 
faker = Factory.create() 

# Create mappings of names & emails to faked names & emails. 
names = defaultdict(faker.name) 
emails = defaultdict(faker.email) 

# Iterate over the rows and yield anonymized rows. 
for row in rows: 
    # Replace the name and email fields with faked fields. 
    row['name'] = names[row['name']] 
    row['email'] = emails[row['email']] 

    # Yield the row back to the caller 
    yield row 


    def anonymize('masktest.csv', 'masktest_tgt.csv'): 
""" 
The source argument is a path to a CSV file containing data to anonymize, 
while target is a path to write the anonymized CSV data to. 
""" 
with open('masktest.csv', 'rU') as f: 
    with open('masktest_tgt.csv', 'w') as o: 
     # Use the DictReader to easily extract fields 
     reader = csv.DictReader(f) 
     writer = csv.DictWriter(o, reader.fieldnames) 

     # Read and anonymize data, writing to target file. 
     for row in anonymize_rows(reader): 
      print (row['name']) 
      writer.writerow(row) 

 

Traceback (most recent call last): 
    File "python", line 34 
    def anonymize('masktest.csv', 'masktest_tgt.csv'): 
          ^
SyntaxError: invalid syntax 
+3

Да, эта строка не является синтаксисом Python. Что вы ожидаете от этого? – Matthias

+0

Прошу прощения, я не понимаю, не могли бы вы объяснить. Как передать входной файл csv в функцию anonymize.I хотел бы передать входные и выходные файлы CSV для маскировки данных. Я смог прочитать из файла, используя «- open» («masktest.csv», «rU») как f: reader = csv.DictReader (f) для строки в считывателе: print (строка ['name' ]) ", но функция не работает. – saran

+0

Ваши отпечатки неверны, пожалуйста, исправьте его – Leva7

ответ

0

Если посмотреть на первоначальном определении, вы увидите правильный синтаксис.

def anonymize(source, target): 
    """ 
    The source argument is a path to a CSV file containing data to anonymize, 
    while target is a path to write the anonymized CSV data to. 
    """ 
    # more code... 

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

Возможно, вы имели в виду, чтобы выполнить одно из следующих действий:

  • вызов функцию, не определить его. В этом случае вам не следует использовать ключевое слово def. Вызов выглядит следующим образом: func(arg1, arg2). Количество значений в скобках должно совпадать с количеством идентификаторов в определении функции. И здесь вместо arg1 и arg2 вы можете использовать строки или любые другие значения или переменные, которые вы определили.

  • Сделать необязательными аргументы функции. В этом случае строковым литералам в круглых скобках должен предшествовать идентификатор и знак =, например: def anonymize(arg1 = 'one', arg2 = 'two'). Это позволит вам вызвать функцию без необходимости предоставлять все аргументы. Если аргументу не присваивается значение, ему присваивается значение по умолчанию, которое вы написали в определении. Допустимые вызовы будут: anonymize('me'), anonymize(), anonymize(arg2 = 'you') и т.д.

+0

Спасибо за помощь Лева. Это очистило мою программу, и я передал литеральные значения, и это сработало нормально. – saran

0

Слово def используется только для определения функции.

Для вызова функции использовать свое имя и параметры без «DEF»:

faked_values = anonimize('file.csv', 'file2.csv') 
+0

Спасибо Eugene. Я только что передал переменные со значениями в самом определении. ex: def anonymize (source = 'masktest.csv', target = 'masktest_tgt.csv'): – saran

0

Благодарности люди. Я удалил функцию и просто передал входное имя файла csv в качестве ввода, и он работал как шарм. Вот код.

import csv 
import unicodecsv as csv 
from faker import Factory 
from collections import defaultdict 

def anonymize_rows(rows): 
""" 
Rows is an iterable of dictionaries that contain name and 
email fields that need to be anonymized. 
""" 
# Load the faker and its providers 
faker = Factory.create() 

# Create mappings of names & emails to faked names & emails. 
names = defaultdict(faker.name) 
emails = defaultdict(faker.email) 

# Iterate over the rows and yield anonymized rows. 
for row in rows: 
    # Replace the name and email fields with faked fields. 
    row['name'] = names[row['name']] 
    row['email'] = emails[row['email']] 

    # Yield the row back to the caller 
    yield row 

#def anonymize('masktest.csv', 'masktest_tgt.csv'): 
""" 
The source argument is a path to a CSV file containing data to anonymize, 
while target is a path to write the anonymized CSV data to. 
""" 
with open('masktest.csv', 'rU') as f: 
with open('masktest_tgt.csv', 'w') as o: 
     # Use the DictReader to easily extract fields 
    reader = csv.DictReader(f) 
    writer = csv.DictWriter(o, reader.fieldnames) 

     # Read and anonymize data, writing to target file. 
    for row in anonymize_rows(reader): 
     print (row['name']) 
     writer.writerow(row) 

Input: идентификатор, имя, электронный адрес, телефон 123, Дэйва джексон, dave.jackson @ email.com, 212-121-3234

замаскированный выход: 123, Элизабет Майерс MD, alicia70 @ hotmail.com, 212-121-3234

+0

Имея ту же проблему ... как вы назвали эту функцию? Какую команду вам нужно выполнить, если у вас есть код в этой форме? –

+0

Здравствуйте Data_Kid, Вы посмотрели образец, который я дал. Пожалуйста, проверьте и дайте мне знать. Я только что использовал имя файла с помощью def ---> (с open ('masktest.csv', 'rU') как f: с открытым ('masktest_tgt.csv', 'w') как o :) – saran

+0

В конечном итоге это сработало. Мне пришлось использовать библиотеку csv, а не unicode. Какую версию python вы используете? –