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

Time:01-08

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=','):

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!!

CodePudding user response:

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
  •  Tags:  
  • Related