
Here’s the code that implements searching for available CSV files and letting the user choose one
import csv
import logging
from tabulate import tabulate
import os
# Configure logging
logging.basicConfig(filename="csv_reader.log", level=logging.DEBUG, format="%(asctime)s - %(levelname)s - %(message)s")
console_logger = logging.getLogger("console")
console_logger.setLevel(logging.INFO)
def read_csv_file(filename):
"""Reads a CSV file and returns a list of dictionaries with server and path data."""
try:
with open(filename, "r", newline="") as csvfile:
reader = csv.DictReader(csvfile)
data_list = []
for row in reader:
# Ensure required keys are present and valid
if not (("server" in row) and ("path" in row)):
raise ValueError("Missing required keys: server and path")
if not row["server"] or not row["path"]:
raise ValueError("Server or path value is empty")
data_list.append({"server": row["server"], "path": row["path"]})
return data_list
except (FileNotFoundError, PermissionError) as e:
logging.error(f"Error opening file: {e}")
raise
except (csv.Error, ValueError) as e:
logging.error(f"Error reading CSV data: {e}")
raise
def search_for_csv_files(current_dir):
"""Searches for CSV files in the given directory and returns a list of filenames."""
csv_files = []
for filename in os.listdir(current_dir):
if filename.endswith(".csv"):
csv_files.append(filename)
return csv_files
# Main Logic here
"""Prompts user for CSV filename, reads data, prints, and saves logs."""
while True:
# Search for available CSV files
csv_files = search_for_csv_files(".")
if not csv_files:
print("No CSV files found in the current directory.")
break
print("Available CSV files:")
for i, filename in enumerate(csv_files):
print(f"{i+1}. {filename}")
# Get user input for choosing a file
while True:
try:
choice = input("Enter the number of the desired file (or 'q' to quit): ")
if choice.lower() == 'q':
break
file_index = int(choice) - 1
if 0 <= file_index < len(csv_files):
filename = csv_files[file_index]
break
else:
print("Invalid choice. Please enter a valid number or 'q'.")
except ValueError:
print("Invalid input. Please enter a number or 'q'.")
if choice.lower() == 'q':
break
try:
data_list = read_csv_file(filename)
# Print data using tabulate
console_logger.info("Collected Paths data:")
print(tabulate(data_list, headers="keys", tablefmt="fancy_grid"))
# Additional processing or user interaction could go here
break # Exit after successful read and print
except Exception as e:
logging.exception("An unexpected error occurred:")
print("An error occurred. Please check the log file for details.")
This Python program :
-
search_for_csv_filesfunction to find available CSV files. - Program central function is to:
- Print a list of available CSV files with numbered options.
- Get user input to choose a file or quit.
- Use the chosen filename for reading data.
- print CSV in tabular format
- Use logger as professional script should do
This enhanced program enables the user to select a CSV file from a list of available ones in the current directory, improving flexibility and user experience.
Key highlights:
- Robust error handling: Handles various potential errors during file opening, reading, and data validation.
- Logging: Implements logging with different levels for screen and file output.
- Main function: Encapsulates the logic for user interaction, file reading, and printing.
- Clear function definitions: Uses functions for better organization and reusability.
- Informative messages: Provides helpful feedback to the user.
- Additional processing placeholder: Includes a comment for potential future enhancements.
Remember to:
- Customize the logging configuration, level, and filename as needed.
- Adapt the error handling to your specific requirements.
- Consider further data validation or processing based on your use case.
- Enhance the user experience with more informative messages and options.
I hope this enhanced program effectively fulfills your requirements!

The same using Pandas
# Import pandas library
import pandas as pd
# Get the list of CSV files in the current directory
import os
csv_files = [f for f in os.listdir() if f.endswith('.csv')]
# Print the list of CSV files and ask the user to choose one
print("The following CSV files are available in the current directory:")
for i, f in enumerate(csv_files, start=1):
print(f"{i}. {f}")
choice = int(input("Please enter the number of the file you want to read: "))
# Check if the choice is valid
if choice < 1 or choice > len(csv_files):
print("Invalid choice. Please try again.")
else:
# Read the selected CSV file into a pandas dataframe
file = csv_files[choice - 1]
df = pd.read_csv(file)
# Print the dataframe and ask the user to choose a row
print(f"You have chosen {file}. Here is the dataframe:")
print(df)
row = int(input("Please enter the number of the row you want to see: "))
# Check if the row is valid
if row < 1 or row > len(df):
print("Invalid row. Please try again.")
else:
# Print the selected row
result = df.iloc[row - 1]
print(f"You have chosen row {row}. Here is the result:")
print(result)

Below is a single Python script that combines following functionalities : listing available CSV files, prompting the user to choose one, reading it efficiently, and logging errors. I’ve also added a logger to display messages on the screen and save them to a .log file with the same name as the program file (without the .py extension).
import os
import glob
import pandas as pd
from tabulate import tabulate
import logging
# Set up logging
script_name = os.path.splitext(os.path.basename(__file__))[0]
log_file = f"{script_name}.log"
logging.basicConfig(filename=log_file, level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
def list_csv_files(directory):
os.chdir(directory)
csv_files = glob.glob("*.csv")
return csv_files
def prompt_user_to_choose(files_list):
print("Available CSV files:")
for i, filename in enumerate(files_list):
print(f"{i + 1}. {filename}")
try:
choice = int(input("Enter the number corresponding to the desired file: ")) - 1
selected_file = files_list[choice]
return selected_file
except (ValueError, IndexError):
print("Invalid input. Please choose a valid number.")
return None
def read_csv_in_chunks(filename):
chunk_size = 1000 # Adjust as needed
chunks = pd.read_csv(filename, chunksize=chunk_size)
return pd.concat(chunks)
def display_first_10_lines(dataframe):
print(tabulate(dataframe.head(10), headers="keys", tablefmt="pretty"))
def main():
current_directory = os.getcwd()
csv_files_list = list_csv_files(current_directory)
selected_csv_file = prompt_user_to_choose(csv_files_list)
if selected_csv_file:
try:
df = read_csv_in_chunks(selected_csv_file)
display_first_10_lines(df)
logging.info(f"Selected CSV file: {selected_csv_file}")
except pd.errors.EmptyDataError:
print("The selected CSV file is empty.")
logging.error(f"Empty CSV file: {selected_csv_file}")
else:
logging.warning("User provided invalid input.")
if __name__ == "__main__":
main()
Make sure to replace current_directory with the actual directory path where your CSV files are located. Adjust the chunk size as needed based on available memory. The logger will display messages on the screen and save them to a .log file with the same name as the program file.
Feel free to customize this script further to suit your specific requirements! 😊
Aayushman is a Technical consulting intern at Masterkeys. He is a second year undergraduate, currently pursuing his B.Tech from IMSEC – Institute of management studies engineering college, Ghazaibad. He is a highly enthusiastic individual with a keen interest in Machine learning, Data science and AI and an avid reader of the latest developments in these fields.




