Как записать строки в CSV-файл - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь создать CSV-файл с одним столбцом путей к файлам.Мне нужен второй столбец, заполненный единицами.

Результат, который я хочу получить, следующий:

./1/a_1.csv, 1
./1/a_2.csv, 1
./1/a_3.csv, 1

Код, который я пробовал, таков:

import numpy as np

data=np.chararray((650,2), itemsize=20)

for i in range(1, 650):
    data[0][0]="./1/a_" + str(i) + ".csv"

np.savetxt("C:\\a.csv", data, delimiter = ",")

Тем не менее, это не похоже на работу.Не могли бы вы помочь?

Ответы [ 6 ]

0 голосов
/ 13 декабря 2018

Я бы использовал Dataframes из библиотеки Pandas.Подобный подход к ответу chitown88, но более компактный.

import pandas as pd

# create a list with paths to files named from 1 to 256
file_paths = ["./1/a_{}.csv".format(i) for i in range(1,257)]

# add the list to a Pandas Dataframe, the column name can be omitted
df = pd.DataFrame(data=file_paths, columns=['Paths'])

# add a column of 1's to the DataFrame
df['1'] = 1

# write the DataFrame without the indices and column names to a csv file using a specific separation character  
df.to_csv('C:\\a.csv', sep=',', index=False, header=False)
0 голосов
/ 13 декабря 2018

В CSV-файле разделителем является ";"не ",".

import numpy as np

data=np.chararray((650,2), itemsize=20)

for i in range(1, 650):
    data[0][0]="./1/a_" + str(i) + ".csv"

np.savetxt("C:\\a.csv", data, delimiter = ";")
0 голосов
/ 13 декабря 2018

Если вам не важно, как создается файл (пока он работает), воспользуйтесь решением AKX.

Если вы хотите сделать это с Numpy, вам нужно получить свой dtype прямо.,np.savetxt имеет форматировщик по умолчанию, который не может понять массив, который вы ему дали.

Вот как мне удалось получить желаемый результат:

data = np.empty((650,2),dtype="S20") # empty array of the correct datatype 

data[:,1] = '1' # set column 1 to '1' (as you noted)

for i in range(650):
    data[i][0] = "./1/a_" + str(i) + ".csv" # put your filenames into first column

np.savetxt(r"C:\a.csv", data, delimiter = ",", fmt="%s") # save it using %s formatter
0 голосов
/ 13 декабря 2018

Мне лично нравится хранить все мои данные в кадре данных, а затем в самом конце сохранять их в CSV-файл, в отличие от записи после каждой итерации.

, поэтому я инициализирую пустой кадр данных с именем results

затем перебирает ваш диапазон, создавая строку file_path.Затем я создаю эту 1 строку с текущей строкой file_name и вашим вторым столбцом.Он добавляется к кадру данных результатов, а затем переходит к следующему элементу в вашем списке / диапазоне.Продолжает этот процесс до тех пор, пока не будет завершен, затем сохранит окончательный кадр данных результатов в файл

import pandas as pd

# initialize an empty dataframe 
results = pd.DataFrame()

# iterates each element in the range list to form a row that is appended to the results dataframe
for i in range(1, 650):
    file_path="./1/a_" + str(i) + ".csv"
    temp_df = pd.DataFrame([[file_path, 1]], columns = ['file_path', 'col_2'])
    results = results.append(temp_df.reset_index(drop = True))

# after iterating through all the elements, saves completed results dataframe to file
results.to_csv("a.csv", index=False))
0 голосов
/ 13 декабря 2018

На каждой итерации цикла вы пишете только data[0][0].Вам нужно изменить свой цикл, чтобы изменить положение массива, которое вы устанавливаете, когда вы делаете цикл в диапазоне.

0 голосов
/ 13 декабря 2018

Вам не нужен Numpy для этого.Просто сделай что-то вроде

with open('a.csv', 'w') as outf:
    for i in range(650):
        print('./1/a_%s.csv, 1' % (i + 1), file=outf)

и ты золотой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...