python - एक csv फ़ाइल में एक NumPy सरणी डंप करें




arrays (7)

क्या एक NumPy सरणी को एक CSV फ़ाइल में डंप करने का कोई तरीका है? मेरे पास 2 डी न्यूमपी सरणी है और इसे मानव-पठनीय प्रारूप में डंप करने की आवश्यकता है।


Answers

आप इसे किसी भी मॉड्यूल के बिना शुद्ध पायथन के साथ भी कर सकते हैं।

# format as a block of csv text to do whatever you want
csv_rows = ["{},{}".format(i, j) for i, j in array]
csv_text = "\n".join(csv_rows)

# write it to a file
with open('file.csv', 'w') as f:
    f.write(csv_text)

हेडर के साथ सीएसवी फाइलों के रूप में रिकॉर्ड एरे लिखना थोड़ा और काम की आवश्यकता है।

यह उदाहरण पहली पंक्ति पर शीर्षलेख के साथ एक CSV फ़ाइल पढ़ता है, फिर उसी फ़ाइल को लिखता है।

import numpy as np

# Write an example CSV file with headers on first line
with open('example.csv', 'w') as fp:
    fp.write('''\
col1,col2,col3
1,100.1,string1
2,222.2,second string
''')

# Read it as a Numpy record array
ar = np.recfromcsv('example.csv')
print(repr(ar))
# rec.array([(1, 100.1, 'string1'), (2, 222.2, 'second string')], 
#           dtype=[('col1', '<i4'), ('col2', '<f8'), ('col3', 'S13')])

# Write as a CSV file with headers on first line
with open('out.csv', 'w') as fp:
    fp.write(','.join(ar.dtype.names) + '\n')
    np.savetxt(fp, ar, '%s', ',')

ध्यान दें कि यह उदाहरण अल्पविरामों के साथ तारों पर विचार नहीं करता है। गैर-संख्यात्मक डेटा के उद्धरणों पर विचार करने के लिए, csv पैकेज का उपयोग करें:

import csv

with open('out2.csv', 'wb') as fp:
    writer = csv.writer(fp, quoting=csv.QUOTE_NONNUMERIC)
    writer.writerow(ar.dtype.names)
    writer.writerows(ar.tolist())

पांडा के साथ यह आसान और तेज़ है

import pandas as pd 
df = pd.DataFrame(np_array)
df.to_csv("file_path.csv")

यदि आप अपनी numpy सरणी को सहेजना चाहते हैं (उदाहरण के लिए your_array = np.array([[1,2],[3,4]]) ) एक सेल में, आप इसे पहले your_array.tolist() साथ परिवर्तित कर सकते हैं।

फिर इसे एक सेल के सामान्य तरीके से सहेजें, delimiter=';' और सीएसवी फ़ाइल में सेल इस तरह दिखेगा [[1, 2], [2, 4]]

फिर आप अपनी सरणी को इस तरह बहाल कर सकते हैं: your_array = np.array(ast.literal_eval(cell_string))


tofile यह करने के लिए एक सुविधाजनक काम है:

import numpy as np
a = np.asarray([ [1,2,3], [4,5,6], [7,8,9] ])
a.tofile('foo.csv',sep=',',format='%10.5f')

मैन पेज में कुछ उपयोगी नोट्स हैं:

यह सरणी डेटा के त्वरित भंडारण के लिए एक सुविधा समारोह है। अंतहीनता और परिशुद्धता पर जानकारी खो जाती है, इसलिए यह विधि विभिन्न एंडियननेस वाली मशीनों के बीच डेटा या परिवहन डेटा संग्रहित करने के लिए फ़ाइलों के लिए एक अच्छी पसंद नहीं है। गति और फ़ाइल आकार की कीमत पर, डेटा फ़ाइलों को पाठ फ़ाइलों के रूप में आउटपुट करके इन समस्याओं में से कुछ को दूर किया जा सकता है।

ध्यान दें। यह फ़ंक्शन मल्टी-लाइन सीएसवी फाइलों का उत्पादन नहीं करता है, यह सब कुछ एक पंक्ति में बचाता है।


अगर आप कॉलम में लिखना चाहते हैं:

    for x in np.nditer(a.T, order='C'): 
            file.write(str(x))
            file.write("\n")

यहां 'ए' numpy सरणी का नाम है और 'फ़ाइल' एक फ़ाइल में लिखने के लिए चर है।

यदि आप पंक्ति में लिखना चाहते हैं:

    writer= csv.writer(file, delimiter=',')
    for x in np.nditer(a.T, order='C'): 
            row.append(str(x))
    writer.writerow(row)

आप बिना ब्रायन के सुझाव लिख सकते हैं try:

from contextlib import suppress

with suppress(IOError), open('filename'):
    process()

suppressपायथन 3.4 का हिस्सा है। पुरानी रिलीज में आप जल्दी ही अपना दबदबा लिख ​​सकते हैं:

from contextlib import contextmanager

@contextmanager
def suppress(*exceptions):
    try:
        yield
    except exceptions:
        pass






python arrays csv numpy