Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

I am trying to convert a CSV to a WAV file, and my inexperience is causing a problem

To start, I know very little about Python. I am trying to convert a CSV to A wav file using a script I found in another post. Best I can tell it was written for an older version of python than the one I am using. One error I am getting is because of the version difference, I am just not sure how to correct it. The other error may be because of my ignorance with Python, but I am not sure of that.

The first error is:

Python\CVS-WAV2.py:44: DeprecationWarning: ‘U’ mode is deprecated
for time, value in csv.reader(open(fname, ‘U’), delimiter=’,’):

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

I know in Python 3 the ‘U’ has been replaced with newline= with either "None, ‘\n’, ‘\r’, or ‘\n\r’. After reading up on the newline function I think that "None" is the option I want.

Once I change ‘U’ to newlinw=None, My first error goes away but I still get the following when I run the script:

File "\Python\CVS-WAV2.py", line 43, in
for time, value in csv.reader(open(fname, newline=’\n’), delimiter=’,’):
ValueError: not enough values to unpack (expected 2, got 0)

I am not sure how to resolve this error though.

#!/usr/bin/python

import wave
import struct
import sys
import csv
import numpy 
from scipy.io import wavfile
from scipy.signal import resample

def write_wav(data, filename, framerate, amplitude):
    wavfile = wave.open(filename,'w')
    nchannels = 1
    sampwidth = 2
    framerate = framerate
    nframes = len(data)
    comptype = "NONE"
    compname = "not compressed"
    wavfile.setparams((nchannels,
                        sampwidth,
                        framerate,
                        nframes,
                        comptype,
                        compname))
    frames = []
    for s in data:
        mul = int(s * amplitude)
        frames.append(struct.pack('h', mul))

    frames = ''.join(frames)
    wavfile.writeframes(frames)
    wavfile.close()
    print("%s written" %(filename)) 


if __name__ == "__main__":
    if len(sys.argv) <= 1:
        print ("You must supply a filename to generate")
        exit(-1)
    for fname in sys.argv[1:]:

        data = []
        for time, value in csv.reader(open(fname, newline=None), delimiter=','):
            try:
                data.append(float(value))#Here you can see that the time column is skipped
            except ValueError:
                pass # Just skip it


        arr = numpy.array(data)#Just organize all your samples into an array
        # Normalize data
        arr /= numpy.max(numpy.abs(data)) #Divide all your samples by the max sample value
        filename_head, extension = fname.rsplit(".", 1)        
        data_resampled = resample( arr, len(data) )
        wavfile.write('rec.wav', 2000, data_resampled) #resampling at 2khz
        print ("File written succesfully !")

Any help would be greatly appreciated!!

>Solution :

There are probably empty lines in your CSV file. One way to skip over those is to use the following:

for record in csv.reader(open(fname, newline=None), delimiter=','):
    if not record:
        continue
    time, value = record
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading