2012-04-19 3 views
1

В моем проекте есть куча csv-файлов, которые могут или не могут быть вызваны на основе ввода пользователем. Я хотел бы сохранить эти файлы в подкаталоге, чтобы сохранить мою папку проекта незагроможденной. Я совершенно не понимаю, как это сделать. Большинство ресурсов, которые я выкопал, связаны с импортом модуля или пакета из подкаталога, а не из базового файла данных.Импорт csv из подкаталога в Python

Строка кода, который импортирует мой CSV в настоящее время выглядит следующим образом:

target_doc = csv.reader(open('sample.csv', 'rU'), delimiter=",", quotechar='|') 

Я предполагаю, что решение будет включать в себя создание переменной пути, используя импорт ОС и импорта SYS, и, возможно, разделив эту строку мультипликатор части?

ответ

7

Вы можете открыть файлы по файловому пути. Просто используйте open('/path/to/file').

Импорт необходим только для модулей и пакетов - исходный код Python.

Единственные реальные замечания здесь - использовать os.path.join(), где соединяются пути для хорошей совместимости в разных операционных системах и файловых системах. Остальная часть модуля os.path также стоит посмотреть, где находятся файлы. Еще одна распространенная ловушка с путями окон - это использование обратных косых символов escape-символов, поэтому вы должны избегать обратных косых черт ("some\\file") - уродливая опция, используйте необработанные строки (r"some\file"), используйте косые черты (Python на самом деле обрабатывает это автоматически), или - лучший , передайте свой путь в качестве аргументов для вышеупомянутого os.path.join().

Возможно также стоит отметить, что с помощью the with statement улучшится ваш код.

например:

with open(os.path.join("path", "to", "file.csv"), 'rU') as file: 
    target_doc = csv.reader(file, delimiter=",", quotechar='|') 
    ... 

Использование with обеспечивает ваш файл будет закрыт - даже если исключения возникают.

+0

О, да, это было просто. Спасибо за предложение предложения _with_, раньше не видел, чтобы он использовал этот способ. – acpigeon

+0

, реализующий с утверждением вызывает ошибку I/O, когда я пытаюсь записать файл в массив: \t для строки в target_doc: \t target_list.extend (строка) – acpigeon

+0

@acpigeon '' csv.reader() '' итерация над файлом, когда вы его используете, поэтому вам нужны какие-либо утверждения, которые используют его внутри блока '' with'', иначе файл будет закрыт. Обратите внимание, что вы можете выполнить то, что вы пытаетесь сделать, просто выполнив '' list (csv.reader (...)) '' (то же самое верно для любого итератора, из которого вы хотите составить список, и если вы хотите сделайте список, внося незначительные изменения или отфильтровывая его, проверьте [список понятий] (https://www.youtube.com/watch?v=t85uBptTDYY)). –

0

Вы можете использовать

import os 
cwd = os.path.dirname(__file__) # get current location of script 

И затем использовать os.path.join (УХО, «некоторые /../ путь»), чтобы построить абсолютные пути в любом месте вы хотите; поэтому ваши пути относятся только к месту вашего сценария, независимо от текущего рабочего каталога для интерпретатора python. Mai также использует os.sep, если вы не хотите зависеть от соглашения unix '/'.

+0

Не было бы меньше проблем использовать относительный путь, а не абсолютный? Мы знаем из вопроса, что каталог по умолчанию в порядке. –

+0

Возможно, вы правы, я думаю, что у меня точно не возник вопрос. –

1

Вы на неправильном пути. Путь и импорт Python предназначены только для «связывания» другого кода python в вашей системе. Другие файлы, используемые в качестве ресурсов в системе доступны, указав полный путь к файлу:

target_doc = csv.reader(open('/resources/csv_files/sample.csv', 'rU'), delimiter=",", quotechar='|') 

или относительный путь от того, где вы работаете файл Python:

target_doc = csv.reader(open('csv_files/sample.csv', 'rU'), delimiter=",", quotechar='|') 
+2

Upvote для веселых каламбуров – acpigeon

0

Почему бы» т вы просто использовать:

path_in = '/directory_whatever_it_is/sample_data.csv'

sample_data = pd.read_csv (path_in)

+0

_why_ Вы считаете, что это ответ? _как это работает? Просто говорить кому-то об изменении своего кода без какого-либо контекста или смысла не помогает им узнать, что они сделали неправильно. – GrumpyCrouton